我有一个JSF应用程序,想让用户在一段时间不活动后自动注销。有标准的方法吗?
通常,承载Web应用程序的服务器(Tomcat,Glassfish …)会处理会话超时。
例如,在Tomcat中,可以通过在web.xml文件中添加以下几行来定义特定Web应用程序的会话超时:
web.xml
<session-config> <session-timeout>30</session-timeout> </session-config>
这会将超时设置为30分钟。
当用户在大于此定义的超时时间的时间内未发送任何请求时,服务器上的会话将无效。如果用户在会话无效后尝试重新连接,则通常会将其重定向到另一个页面或错误页面。
您可以开发自己的JSF筛选器,该筛选器将自动将用户重定向到timeout.html页面。这是此类过滤器的示例:
timeout.html
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() { } }