gpt4 book ai didi

jsf - 无法从 Servlet 过滤器内的 FacesContext 检索 session

转载 作者:行者123 更新时间:2023-12-04 14:10:34 25 4
gpt4 key购买 nike

在对我的用户进行身份验证后,我想在 session 中添加对当前登录用户的引用。

在这里我如何在 setCurrentUser 中做到这一点方法 :

FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.setAttribute("CURRENT_USER", currentUser);

不幸的是, session引用始终为空!

或者,我尝试使用 sessionMap
FacesContext facesContext = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = facesContext.getExternalContext().getSessionMap();
sessionMap.put("CURRENT_USER", currentUser);

它悲惨地失败了这个异常(exception):
java.lang.UnsupportedOperationException
at java.util.AbstractMap.put(AbstractMap.java:186)
(...)

我究竟做错了什么 ?

我的 Controller 的完整代码

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);
}

//...
}

JSF 2.0
JBoss 5.1.0.GA

最佳答案

FacesContextFilter 中不可用如 FilterFacesServlet 之前调用.

您应该从 request 获取 session 取而代之的说法。

HttpSession session = ((HttpServletRequest) request).getSession();
session.setAttribute("user", currentUser);
// ...

一旦您处于 JSF 上下文中(例如,在 JSF 托管 bean 或 JSF View 中),这将通过 getSessionMap() 可用。在完全相同的属性名称上
User user = (User) externalContext.getSessionMap().get("user");

或者只是通过 #{user}在 EL:
@ManagedProperty("#{user}")
private User user;

关于jsf - 无法从 Servlet 过滤器内的 FacesContext 检索 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11014105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com