我一直在查看有关此主题的许多帖子,但找不到适合我的解决方案。
我正在使用带有 JSF 2.0 的 Java EE 6(部署在 JBoss AS 7.1 上)
在我的web.xml
我有:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
我希望在会话自动超时时将用户重定向到登录页面。
我尝试过的:
方法一:使用过滤器
我尝试了以下过滤器:
@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
我尝试过的
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
和
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
过滤器在每个请求上都被调用(在控制台中记录“fiter called”)。但是,会话超时时不会调用它。
方法二:HttpSessionLister
我曾尝试使用HttpSessionListerner
. 调用的方法具有以下签名:
public void sessionDestroyed(HttpSessionEvent se) {
}
我无法重定向到特定页面。当我想重定向用户时,我通常使用NavigationHandler
from ,FacesContext
但在这种情况下没有FacesContext
(FacesContext.getCurrentInstance()
返回null
)。
根据这篇文章, HttpListener 无法重定向用户,因为它不是请求的一部分。
问题
解决这个问题的最佳方法是什么?我该怎么做才能使上述两种方法之一起作用?