无法在 Web 过滤器中访问会话范围的 JSF 托管 bean
Can't Access session scoped JSF managed bean in web filter
我有一个带有登录页面的 JSF 2.2 应用程序,我需要控制用户对页面的访问,所以我编写了一个 Web 过滤器,但问题是当我尝试访问会话范围时它总是 return null JSF 托管 bean。我已经登录并确保登录工作正常并且用户设置正确但是当我访问 bean 时它仍然 returns 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);
}
}
}
我写了一个示例代码来检索所有会话属性,但我找不到 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
您同时使用了 @ManagedBean
和 @Named
注释,您只能使用其中之一。
因为您正在使用 javax.enterprise.context.SessionScoped
作为 @SessionScoped
,这意味着您正在使用 CDI Managed beans,那么您应该只使用 @Named
来管理您的 bean CDI。
您可以查看 BalusC's answer 以了解有关 @Named
和 @ManagedBean
注释之间差异的更多信息
更新:
关于您的评论,您不需要使用:
UserLogin loginBean = (UserLogin) ((HttpServletRequest) request).getSession().getAttribute("userLogin")
你可以这样使用它:
public class YourFilter {
@Inject
UserLogin loginBean;
...
}
我有一个带有登录页面的 JSF 2.2 应用程序,我需要控制用户对页面的访问,所以我编写了一个 Web 过滤器,但问题是当我尝试访问会话范围时它总是 return null JSF 托管 bean。我已经登录并确保登录工作正常并且用户设置正确但是当我访问 bean 时它仍然 returns 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);
}
}
}
我写了一个示例代码来检索所有会话属性,但我找不到 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
您同时使用了 @ManagedBean
和 @Named
注释,您只能使用其中之一。
因为您正在使用 javax.enterprise.context.SessionScoped
作为 @SessionScoped
,这意味着您正在使用 CDI Managed beans,那么您应该只使用 @Named
来管理您的 bean CDI。
您可以查看 BalusC's answer 以了解有关 @Named
和 @ManagedBean
注释之间差异的更多信息
更新:
关于您的评论,您不需要使用:
UserLogin loginBean = (UserLogin) ((HttpServletRequest) request).getSession().getAttribute("userLogin")
你可以这样使用它:
public class YourFilter {
@Inject
UserLogin loginBean;
...
}