2014-09-12 80 views
0

在Spring MVC中,我可以通過以下代碼獲取所有會話。如果瀏覽器關閉或電源關閉,是否可以使spring mvc會話失效?

int active= sessionRegistry.getAllPrincipals().size(); 
List<String> activeSessionsId = new ArrayList<String>(); 
for(int i=0;i<active;i++){ 
    List<SessionInformation> si= 
     sessionRegistry.getAllSessions(sessionRegistry.getAllPrincipals().get(i), false); 
    for(SessionInformation s:si){ 
     System.out.println("SessionId="+s.getSessionId()); 
     activeSessionsId.add(s.getSessionId()); 
    } 
} 

這裏sessionRegistory是我的春天定bean我配置這樣的:

<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" /> 

而且在我的控制器自動裝配這樣的:

@Resource(name="sessionRegistry") 
private SessionRegistryImpl sessionRegistry; 

我想activeSessionsId名單將只包含活動會話,但它包含我登錄並由spring安全傳遞的所有用戶會話。對於某些用戶,我關閉了瀏覽器而無需註銷,並且我預計此會話將不會添加到我的activeSessionsId 列表中,但它不是那樣的。

我觀察到所有sessionId都添加在activeSessionsId中。

其實明智的我知道會話創建是由服務器端發生的。但請任何人讓我知道無論我嘗試的是否有可能在春季MVC的情況下。

回答

0

一般來說,當我關閉瀏覽器時,我所說的服務器將無法知道我關閉了瀏覽器 - 除非您以某種方式告訴它。通常情況下,您可以使用一些javascript來執行此操作,並偵聽瀏覽器關閉事件並調用服務器以告訴他們關閉了瀏覽器。

在此調用,您可以無效該用戶的會話,並且應該從你的活動會話列表

或者刪除它,你,你這會在一定的時間到期刪除會話服務器上添加會話超時。

1

從服務器的角度來看,您必須承認您無法知道瀏覽器是否關閉。好吧,你可以嘗試使用JavaScript關閉窗口時,送東西,但什麼可能發生:

  • 網絡可以在任何時候往下走(系統,調制解調器,代理),自願或不
  • 電源可以熄滅,自願或不
  • JavaScript可以被禁用
  • 用戶可以使用模擬瀏覽器(硒,Python或Java或...代碼),可以選擇忽略的JavaScript
  • 的全部或部分

因此,如果你想使用JavaScript,它將在絕大多數用例中工作,但始終爲不需要的靜默斷開保持會話超時,無論你做什麼都可能會發生。

相關問題