2016-07-04 50 views
0

我的Web應用程序純粹是JS應用程序,具有用於路由的十字路口js。 對於登錄我正在使用j_security_check FORM Auth和/ LogOut servlet來使會話無效。Java:HttpSession超時篩選器檢查返回有效會話對象

1期 當會話超時,login.html的呈現在沒有CSS頁面的一部分,與錯誤「資源解釋爲樣式,但與MIME類型的文本傳輸,真正的問題來/ HTML '

當使用過濾器

<filter> 
    <description>Session Timeout Filter</description> 
    <filter-name>SessionTimeoutFilter</filter-name> 
    <filter-class>filters.SessionTimeoutFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SessionTimeoutFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
.... 
<session-config> 
    <session-timeout>1</session-timeout> 
</session-config> 

和JAVA代碼

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) 
     throws IOException, ServletException { 

    HttpServletRequest req = null; 
    HttpSession session = null; 
    try { 
     req = (HttpServletRequest) request; 
     session = req.getSession(false); 
     if (session != null && !session.isNew()){ 
      LOGGER.log("Session is Valid"); 
      chain.doFilter(request, response); 
     }else{ 
      LOGGER.log("Session is Invalid"); 
      req.getRequestDispatcher("/login.html?loggedOut=true").forward(request, response); 
     }    
    } catch (Throwable t) { 

    } 

} 

第2期 當過濾器在說明不活動的2-3分鐘後運行時,它會打印「會話有效」。爲什麼這樣?

回答

0

問題1:

當會話是無效的,對過濾器攔截的請求,並轉發給的login.html。 login.html包含一個CSS文件。所以瀏覽器發送一個CSS文件的HTTP請求。但是你的過濾器映射到/*。因此它攔截了每個請求,包括瀏覽器爲CSS文件發送的請求。由於會話仍然無效,因此瀏覽器將請求發送給login.html,該請求應發送CSS文件。

問題2:

我不知道。也許你的服務器每隔幾分鐘使用一次後臺線程清理超時會話,並且它還沒有被執行,儘管你的超時時間很短。或者,瀏覽器可能會在後臺發送請求,使會話保持活動狀態。

+0

對於問題1,如果請求用於登錄HTML和CSS,則我在篩選器中包含一個檢查以繼續篩選。即使在這種情況下,問題仍然存在。 –