在JSF应用程序中自动注销

时间:2009-10-01 11:13:03

标签: java jsp jsf

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

1 个答案:

答案 0 :(得分:4)

通常,托管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() { 
    } 

}