在JSF应用程序中自动注销

我有一个JSF应用程序,并希望用户在一段时间不活动后自动注销。 有没有标准的方法来做到这一点?

通常,托管Web应用程序的服务器(Tomcat,Glassfish …)会处理会话超时。

例如,在Tomcat中,您可以通过在web.xml文件中添加以下行来定义特定Web应用程序的会话超时:

  30  

这会将超时设置为30分钟。

当用户在超过此定义的超时的时间内未发送任何请求时,服务器上的会话将失效。 如果用户在会话失效后尝试重新连接,则通常会将其重定向到另一个页面或错误页面。

您可以开发自己的JSFfilter,它将自动将用户重定向到timeout.html页面。 以下是此类filter的示例:

 public class TimeoutFilter implements Filter { private static final String TIMEOUT_PAGE = "timeout.html"; private static final String LOGIN_PAGE = "login.faces"; public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) { HttpServletRequest requestHttp = (HttpServletRequest) request; HttpServletResponse responseHttp = (HttpServletResponse) response; if (checkResource(requestHttp)) { String requestPath = requestHttp.getRequestURI(); if (checkSession(requestHttp)) { String timeoutUrl = hRequest.getContextPath() + "/" + TIMEOUT_PAGE; responseHttp.sendRedirect(timeoutUrl); return; } } filterChain.doFilter(request, response); } private boolean checkResource(HttpServletRequest request) { String requestPath = request.getRequestURI(); return !(requestPath.contains(TIMEOUT_PAGE) || requestPath.contains(LOGIN_PAGE) || requestPath.equals(hRequest.getContextPath() + "/")); } private boolean checkSession(HttpServletRequest request) { return request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid(); } public void destroy() { } }