2016-09-19 60 views
1

我在我的應用程序中輪詢每5分鐘執行一次的HTTP請求。HTTP會話:如何配置不會更改會話過期的URL?

我要配置這些網址不改變會話過期。 否則我的會話永遠不會過期(我不想要它)。 無法在web.xml和HttpSession文檔中找到它。

怎麼可能做到這一點?

新增

非常重要的澄清:請求進行身份驗證。 這意味着請求應附加到已經過身份驗證的JsessionID。

澄清(新增2)

我不希望,無論用戶是否保持有效與否的會話將到期。我希望會話將在用戶不活動時過期,並且如果用戶在UI上工作,則不會過期。儘管每5分鐘會有一次輪詢請求,但我希望會話將在用戶不活動時過期

+0

不要將JSESSIONID(刪除或設置爲別的東西)這個請求,讓服務器認爲它的一個新的請求。 –

+0

該請求應通過認證 – Michael

+0

jsessionid是服務器用於識別會話的依據。你能否使用其他標識符來獲取用戶信息,如不同的cookie,並從這些請求中刪除jsessionid? –

回答

2

這不是由標準的Servlet API的支持。

最好的辦法是創建一個全局servlet過濾器(使用@WebFilter("/*")),每當特定的URL訪問服務器時將其減少爲HttpSession#setMaxInactiveInterval(),並將其恢復爲其他URL的默認值。它只需要一點基本的數學。

實施中的相關內容可以是這樣的:

private static final int DEFAULT_EXPIRE_TIME_IN_SECONDS = 1800; 
private static final String SKIP_EXPIRE_TIME_ON_URI = "/somePollServlet"; 

@Override 
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpSession session = request.getSession(); 

    if (request.getRequestURI().equals(request.getContextPath() + SKIP_EXPIRE_TIME_ON_URI)) { 
     long lastAccessedTime = session.getLastAccessedTime(); 
     long currentTime = System.currentTimeMillis(); 
     int newExpireTime = DEFAULT_EXPIRE_TIME_IN_SECONDS - (int) ((currentTime - lastAccessedTime)/1000); 
     session.setMaxInactiveInterval(newExpireTime); 
    } 
    else { 
     session.setMaxInactiveInterval(DEFAULT_EXPIRE_TIME); 
    } 

    chain.doFilter(req, res); 
} 
+0

過濾器是否可以從web.xml中讀取會話超時值? ' 5 ' – Michael

+1

@Michael:也不是標準的API:http://stackoverflow.com/q/17528373替代方法是記住在會話中首先調用'getMaxInactiveInterval()'。 – BalusC

-1

在您的情況下,您需要一個會話管理方案,該方案在N分鐘時間內過期,而不管用戶是否保持活動狀態。這樣你就不需要通過任何認證或默認的cookies。

您可以通過兩種方法實現它提出here

  1. 預定作業從登錄
  2. 標頭,並且基於過濾器的方法N分鐘後會話無效來動態決定會話到期。
+0

這不是我所需要的。我不希望會話將會過期,無論用戶是否保持活動狀態。我希望會話將在用戶不活動時過期,並且如果用戶在UI上工作,則不會過期。我希望會話將在用戶不活動時終止,儘管每5分鐘會有一次輪詢請求 – Michael

0

有許多方法來這樣做。其中之一是使用javascript例如JQuery。主要思想是,不管腳本是否輪詢服務器,如果用戶沒有對應用程序進行任何活動,例如在合理的持續時間內按下按鍵,鼠標移動等,則需要考慮用戶不在場且javascript需要調用您的應用程序的註銷url。請參考提供的網址,它可以很好地解釋這個概念。

+0

插件如何區分由用戶活動(例如按鍵,鼠標移動等引起的請求)和池請求? – Michael

+0

用戶活動通常建模爲可以處理的JS引擎的事件,另一方面的投票是從引擎內執行的活動,例如, Angular等中的$ http調用,框架可以跟蹤事件,並且在指定的時間段內沒有任何事件可以被解釋爲無用戶活動 – Ironluca

+0

由於一個輪詢請求,我無法更改現有UI。正如我在問題中所說的,我需要配置池化URL – Michael