我有一个带登录页面的JSF 2.2应用程序我需要控制用户对页面的访问权限,所以我写了一个web过滤器,但问题是当我尝试访问会话作用域的JSF托管bean时它总是返回null。我已经登录并且确保登录正常并且用户设置正确但仍然在我访问bean时它返回null
这是我访问bean的过滤器代码
UserLogin loginBean = (UserLogin) ((HttpServletRequest) request).getSession().getAttribute("userLogin");
这里是方法
中登录的bean代码@Named(value = "userLogin") @SessionScoped @ManagedBean
public class UserLogin implements Serializable {
/**
* Creates a new instance of UserLogin
*/
public UserLogin() {}
private static final long serialVersionUID = 1520318172495977648L;
private User user = null;
String email, password;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public void login() {
UserHelper userHelper = new UserHelper();
user = userHelper.Login(email, password);
if (user != null) {
FacesMessage msg = new FacesMessage("Successful", "Welcomesss :" + user.getFirstname());
FacesContext.getCurrentInstance().addMessage(null, msg);
} else {
FacesMessage msg = new FacesMessage("Failed", "Wrong Usernames or password.");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
}
我写了一个示例代码来检索所有会话attrbuties但我找不到userLogin 这是方法及其输出
Enumeration attrs = ((HttpServletRequest) request).getSession().getAttributeNames();
while (attrs.hasMoreElements()) {
LOG.log(Logger.Level.FATAL, attrs.nextElement());
}
FATAL: WELD_S #10
FATAL: com.sun.faces.application.view.activeViewMaps
FATAL: org.jboss.weld.context.conversation.ConversationIdGenerator
FATAL: com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap
FATAL: org.jboss.weld.context.ConversationContext.conversations
FATAL: com.sun.faces.application.view.activeViewContexts
FATAL: javax.faces.request.charset
FATAL: org.jboss.weld.context.beanstore.http.LockStore
答案 0 :(得分:2)
您正在使用@ManagedBean
和@Named
注释,您只能使用其中一个注释。
当您使用javax.enterprise.context.SessionScoped
表示您正在使用CDI Managed beans时@SessionScoped
,那么您应该只使用@Named
来管理您的bean CDI。
您可以查看BalusC's answer,了解有关@Named
和@ManagedBean
注释之间差异的更多信息
关于您的评论,您不需要使用:
UserLogin loginBean = (UserLogin) ((HttpServletRequest) request).getSession().getAttribute("userLogin")
您可以像这样使用它:
public class YourFilter {
@Inject
UserLogin loginBean;
...
}