小编典典

JSF应用程序中的自动注销

jsp

我有一个JSF应用程序,想让用户在一段时间不活动后自动注销。有标准的方法吗?


阅读 356

收藏
2020-06-08

共1个答案

小编典典

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

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

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

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

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

您可以开发自己的JSF筛选器,该筛选器将自动将用户重定向到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() { 
    }

}
2020-06-08