我一直在查看有关此主题的许多帖子,但无法找到适合我的情况的解决方案。
我正在使用 Java EE 6 和 JSF 2.0(部署在 JBoss AS 7.1 上)
In my web.xml
I have:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
and I 希望当会话自动超时时将用户重定向到登录页面。
我尝试过的:
方法一:使用过滤器
我尝试过以下过滤器:
@WebFilter()
public class TimeOutFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
System.out.println("filter called");
final HttpServletRequest req = (HttpServletRequest) request;
final HttpSession session = req.getSession(false);
if (session != null && !session.isNew()) {
chain.doFilter(request, response);
} else {
System.out.println("Has timed out");
req.getRequestDispatcher("/logon.xthml").forward(request, response);
}
}
@Override
public void destroy() {
}
}
In the web.xml
我努力了
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
and
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
过滤器的工作方式是在每个请求上调用它(在控制台中记录“fiter called”)。但是,当会话超时时,不会调用它。
方法2:HttpSessionLister
我尝试过使用HttpSessionListerner
。调用的方法具有以下签名:
public void sessionDestroyed(HttpSessionEvent se) {
}
我无法重定向到特定页面。当我想重定向用户时,我通常使用NavigationHandler
来自FacesContext
但在这种情况下没有FacesContext
(FacesContext.getCurrentInstance()
回报null
).
根据这个post,HttpListener 无法重定向用户,因为它不是请求的一部分。
Question
解决这个问题的最佳方法是什么?我该怎么做才能使上述两种方法之一发挥作用?