2013-11-15 33 views
3

是否有可能指示Jetty服務器在訪問特定的servlet時不更新會話的上次訪問時間?在Jetty中防止會話的上次訪問時間更新

我們的用例是一個HTML頁面,每5分鐘在後臺發送一次異步請求以刷新其內容。會話的超時設置爲30分鐘。 此配置的不幸問題是,當用戶在瀏覽器的選項卡中將該頁面打開時,會話永不過期,因爲會話的訪問時間由每個異步請求更新。

爲了正確起見,我不得不承認,我沒有嘗試任何東西,因爲我無法在互聯網上找到我的問題的任何幫助。如果我所要求的是不可能的,我正在考慮將訪問時間存儲在由應用程序直接控制的會話變量中。在處理請求之前(在Servlets的doGetdoPost方法中),必須提前檢查此值,並且會話需要手動失效。有更好的解決方案嗎?

回答

3

Servlet無法區分請求是由某個腳本還是人類生成的,因爲這兩個請求都來自同一個瀏覽器,因此會發送相同的JSESSIONID。所以你必須標記這些請求以區分它的來源。您可以通過某些標題或請求參數標記它們。

我喜歡你的存儲訪問時間在會議的變量的想法(這將小豬回servlet會話到期) 你的算法會在這種情況下:

if isUser(request){ 
    session.lastRobotAccess == null 
}else{ 
    if (session.lastRobotAccess == null) { 
     session.lastRobotAccess = current_time 
    } else { 
     if(current_time - session.lastRobotAccess > session.timeout){ 
      session.invalidate 
     } 
    } 
} 

當請求到達servlet容器是第一由過濾器處理(如果已定義),然後由servlet處理。 Filters are useful for

的過濾器常見的情況是,你要應用 預處理或後處理的請求或響應對servlet的一組 ,而不僅僅是一個單一的servlet之一。如果您只需要修改一個servlet的 請求或響應,則不需要創建一個 過濾器 - 只需在servlet本身中直接執行即可。

由於您可以通過過濾器訪問會話,因此它們更適合您的邏輯。您不會通過額外的檢查來污染servlet的邏輯,並且可以將其應用於其他servlet。過濾器也是servlet規範的一部分,所以它可以在任何容器中工作。

你已經知道這件事了,但我剛剛把它們放在「紙」上:-D

+0

感謝您使用過濾器的想法。 –