2016-02-11 61 views
1

我想在java應用程序中創建一個計時器,根據哪個用戶可以在預定義的時間內登錄到應用程序。一旦定時器值達到零,他/她將失去它的會話對象並自動註銷。代碼中的計時器

如果用戶在預定義時間內執行某些任務,他的會話時間將增加,否則他的時間將減少。一旦他達到預定義的低時間,他將無法再次登錄。

建議定時器對當前會話有影響的一些方法。

謝謝:)

+0

'「誰能幫我的代碼......」「 - 你誤解如何使用這個網站,你走得更遠之前,你要經過[旅遊]和[幫助]部分。 –

+0

我期待解決這個問題。 –

+0

你在尋求代碼,而不是這個網站的工作方式。這不是「給我的代碼網站」。如果你繼續這一問題的話,再讀一下你所面對的許多未來失望的鏈接。 –

回答

2

免責聲明:

我可以看到一個與安全相關的理由做這樣的東西。我已經看過這種方法幾次和各種應用程序,所以我可以理解爲什麼這樣的要求可以提高。當然,我不認爲它是一個好主意來實現這樣的東西,但考慮到要求,我會分享我的想法並提供解決方案。

既然你在這裏討論會議,我假設你在網絡域中。

IMO有幾種方法可以解決這個問題。

  • 假設,每個客戶都分配給它的HttpSession

    一旦在創建該會話的第一個電話,就把「當前時間」走進去。然後創建一個Filter,在第一個請求執行上述邏輯時,每次請求都將當前時間與第一個請求期間設置的時間進行比較。如果差異小於允許的時間 - 繼續執行,否則強制註銷,刪除會話和所有內容。我想用戶將被迫在此之後重新連接。

實施例:

比方說的用戶被允許登錄在10分鐘

在過濾器的任何後續請求

然後(僞碼):

doFilter() { 

    // if its a first request: 
    if(httpSessionIsCreatedInThisRequest() && noFirstLoginTimeOnSession()) { 
     httpSession.put("FIRST_LOGIN_TIME", getCurrentTime()) 
    } 
    else { // for any subsequent request 
     currentTime = getCurrentTime() 

     if(currentTime - getFromSession("FIRST_LOGIN_TIME") < 10 mins) { 
     // you can proceed 
     } 
     else { 
      logout() 
     //do whatever You Need Here: logout, destroy the session 
     } 
    } 
    } 

這個解決方案對於簡單情況已經足夠了,但對於分佈式應用程序不夠(不擴展)。另外,如果你有很多用戶,爲每個用戶維護一個HttpSession是一個很大的開銷,因爲HttpSession只具有不可擴展性,並且你不希望進行會話複製,因爲它總是很痛苦:)

  • 除了HttpSession,您可以通過Cookie實現相同的邏輯,但我懷疑Security-Wise是否足夠好。我提到這一點是因爲我不知道你的任何安全問題。

  • 更多可擴展的方法。而不是使用HttpSession,使用一些持久的鍵值存儲/像Redis服務器的東西。將所有信息存儲在那裏。

    根據具體的後端技術,您可以選擇使用分配給數據庫中每條記錄的TTL。您可能知道,但爲了完整答案:TTL(生存時間)意味着您可以指定服務器將清除該對象的時間(清除),而不會受到干擾。所以在這種情況下,你只需要檢查對象是否存在。這可以從許多服務器完成,因爲假設它們同步,在這種情況下它們不共享關於用戶的任何信息,所以這可以更好地擴展。

現在您已經注意到所有這些解決方案根本不使用計時器。 計時器可能會很貴,如果您使用java util定時器爲每個用戶使用引擎蓋下的線程。所以有多少線程綁定到用戶數是一個壞主意恕我直言。

您可以利用像Quartz這樣的解決方案(這是一個調度框架),但是如果您嘗試爲不同的用戶創建不同的觸發器,它將變成一個混亂且不可維護的代碼。 此外,如果你有太多的作業/觸發器,Quartz開始滯後,這不是你想要的。底線,我真的不相信你應該在這種特殊情況下使用它。石英是一個很好的產品,不要誤解我的意思,我只是認爲它不適合你的需求。

希望這有助於

+0

真棒,我一直在尋找這些細節,我的應用程序有一個模塊,應該只在特定的時間由用戶運行,一旦任務在這段時間內完成,時間限制可以延長。使用過濾器和當前時間+登錄時間(來自會話)的接近可能很有用。 非常感謝:) –

0

保持這種在web.xml文件

<session-config> 
    <session-timeout> 1000 </session-timeout> 
</session-config> 
+0

不,我不是在尋找這種方法,只有當用戶在特定的持續時間內處於非活動狀態時,纔會結束會話,即使用戶處於活動狀態,我也想結束會話。 –

+0

爲什麼你想強制註銷用戶......傢伙? –

+0

它的一個要求,我想限制用戶只需登錄一個特定的日期或時間的特定時間... –