我一直在看这个话题的很多帖子,但是无法得到一个适用于我的例子的解决方案.
我正在使用Java EE 6与JSF 2.0(部署在JBoss AS 7.1上)
在我的web.xml中,我有:
1
我希望用户在会话自动超时时被重定向到登录页面.
我试过了
方法1:使用过滤器
我尝试了以下过滤器:
@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() {
}
}
在web.xml我尝试过
TimeOutFilter
*.xhtml
和
TimeOutFilter
Faces Servlet
过滤器的工作原理是每个请求(在控制台中记录“fiter called”).但是当会话超时时,它不会被调用.
方法2:HttpSessionLister
我试图使用一个HttpSessionListerner.该方法称为具有以下签名:
public void sessionDestroyed(HttpSessionEvent se) {
}
我无法重定向到特定页面.当我想重定向用户时,我通常使用FacesContext中的NavigationHandler,但在这种情况下,没有FacesContext(FacesContext.getCurrentInstance()返回null).
根据这个post,HttpListener不能重定向用户,因为它不是请求的一部分.
题
解决这个问题最好的方法是什么?我可以做些什么来做上述两种上述方法之一?