2009-10-01 66 views

回答

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() { 
    } 

} 
+0

這將失敗,當你將第一次訪問不在你的checkResource方法的url。不是嗎?你會不會得到一個會話過期的行爲,即使你只是第一次訪問該頁面? – 0m4r 2013-12-04 14:33:34