Ste*_*han 4 session jsf facescontext servlet-filters
在验证我的用户之后,我想在会话中将引用添加到当前登录用户.
这里我是如何在setCurrentUser方法中做到的:
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.setAttribute("CURRENT_USER", currentUser);
Run Code Online (Sandbox Code Playgroud)
不幸的是,session引用始终为null!
或者,我尝试使用sessionMap
FacesContext facesContext = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = facesContext.getExternalContext().getSessionMap();
sessionMap.put("CURRENT_USER", currentUser);
Run Code Online (Sandbox Code Playgroud)
这个例外情况很糟糕:
java.lang.UnsupportedOperationException
at java.util.AbstractMap.put(AbstractMap.java:186)
(...)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么 ?
我的控制器的完整代码
UserController.java
public class UserController implements Filter {
private FilterConfig fc;
private static final String CURRENT_USER = "CURRENT_USER";
public void init(FilterConfig filterConfig) throws ServletException {
fc = filterConfig;
log(">> Filter initialized");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// Authenticate user
// ...
// Save refernce in Session
setCurrentUser(currentUser);
//(...)
}
public static void setCurrentUser(User u) {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.setAttribute(CURRENT_USER, u);// session is always NULL
}
public static User getCurrentUser() {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
return (User)session.getAttribute(CURRENT_USER);
}
//...
}
Run Code Online (Sandbox Code Playgroud)
JSF 2.0
JBoss 5.1.0.GA
Bal*_*usC 11
该FacesContext不是在现有Filter的Filter调用之前的FacesServlet.
您应该从request参数中获取会话.
HttpSession session = ((HttpServletRequest) request).getSession();
session.setAttribute("user", currentUser);
// ...
Run Code Online (Sandbox Code Playgroud)
一旦你进入JSF上下文(例如在JSF托管bean或JSF视图中),那么这将在getSessionMap()相同的属性名称上可用
User user = (User) externalContext.getSessionMap().get("user");
Run Code Online (Sandbox Code Playgroud)
或者只是#{user}在EL:
@ManagedProperty("#{user}")
private User user;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17722 次 |
| 最近记录: |