我正在使用maven,jsf 2.0,java ee 6,jpa和glassfish。我有一个初始网页,询问您是否要登录或注册。如果他们说他们想登录,他们会被转发到facelets/primefaces 3,该facelets/primefaces 3会显示带有用户名和密码文本框的登录页面。对于用户名文本字段,它的值是facelets'target unreachable'
值= “#{} authenticator.username”
,我得到一个
“目标不可达,标识 '认证' 解决为空“
我正在使用beans.xml。我遵循了CDI bean的命名约定。 我在Authenticator构造函数中插入了一条日志消息,它看起来永远不会被调用,因为我没有收到消息。
另一个古怪的是,一旦在一个蓝色的月亮它的作品,我也得到类似如下:
07/08/2012 00:27:56.140信息...身份验证 - 在验证器构造
07/08/2012 00:27:56.171信息...验证器 - 让身份验证的用户名
07/08/2012 00:27:56.171信息...身份验证 - 在验证器构造
07/08/20 12 00:27:56.171信息...验证器 - 让身份验证密码
07/08/2012 00:27:56.171信息...身份验证 - 在验证器构造
07/08/2012 00:27 :56.171信息...验证器 - 让身份验证的用户名
07/08/2012 00:27:56.171信息...身份验证 - 在验证器构造
07/08/2012 00:27:56.171信息。 ..Authenticator - 获取Authenticator密码
07/08/2 012 00:28:05.843信息...身份验证 - 在验证器构造
07/08/2012 00:28:05.843信息...身份验证 - 在验证器构造
07/08/2012 00:28 :05.843 INFO ...身份验证 - 在验证器构造
07/08/2012 00:28:05.843信息...验证器 - 让身份验证的用户名
07/08/2012 00:28:05.843信息。 ..Authenticator - 身份验证器构造函数
07/08/2012 00:28:05.906信息...身份验证 - 在验证器构造
07/08/2012 00:28:05.906信息...验证器 - 让身份验证密码
07/08/2012 00:28: 26.000信息...身份验证 - 在验证器构造
07/08/2012 00:28:26.000信息...认证 - 在认证constructor`
07/08/2012 00:28:26.000信息...认证 - 中验证器构造
07/08/2012 00:28:26.031信息...认证 - 在验证器构造 07/08/2012 00:28:26.031信息...认证 - 获得身份验证密码
当它工作时,我不明白它为什么称之为构造这么多次。
这里进行管理(CDI)豆:
package com.mlb.mybills.view.user;
import com.mlb.mybills.i18n.Messages;
import java.util.Locale;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Named("authenticator")
@ViewScoped
public class Authenticator
{
private static final Logger log = LoggerFactory.getLogger(Authenticator.class);
private String username;
private char[] password;
public Authenticator()
{
log.info("in Authenticator constructor");
}
public String getUsername()
{
log.info("getting Authenticator username");
return username;
}
public void setUsername(String username)
{
log.info("getting Authenticator username");
this.username = username;
}
public char[] getPassword()
{
log.info("getting Authenticator password");
return password;
}
public void setPassword(char[] password)
{
log.info("setting Authenticator password");
this.password = password;
}
public void setPassword(String password)
{
log.info("setting Authenticator password");
this.password = password.toCharArray();
}
public String authenticate()
{
log.info("in Authenticator.authenticate");
String result = null;
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
try
{
request.login(username, new String(password));
//result = "/private/group.xhtml?faces-redirect=true";
result = "/group.xhtml?faces-redirect=true";
}
catch (ServletException ex)
{
log.error("Failed to authenticate user.", ex);
Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, Messages.getString(
"Login.InvalidIdPasswordMessage", locale), null);
FacesContext.getCurrentInstance().addMessage(null, facesMessage);
}
log.info("result=" + result);
return result;
}
public String logout()
{
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
try
{
request.logout();
}
catch (ServletException servletEx)
{
log.warn("Failed to logout the user", servletEx);
}
return "/Login.xhtml?faces-redirect=true";
}
}
Post Authenticator托管bean代码。 – 2012-07-09 09:00:01