2013-05-03 121 views
0

我使用Spring Security。我不知道如何在一個過程中過期Spring Security會話。手動過期彈簧安全會話

我試過,但它給出了一個空指針異常:

List<SessionInformation> allSessions; 

SessionRegistry sessionRegistry; 

// this line returns a null pointer exception 
allSessions = sessionRegistry.getAllSessions("userName", true); 

if (allSessions != null) { 
    for (SessionInformation sessionInformation : allSessions) { 
     logger.info("Expiring session for user: " 
      + username 
      + " - " 
      + sessionInformation.getSessionId()); 

     sessionInformation.expireNow(); 
    } 
} 

回答

0

SessionRegistry是不是框架的核心組成部分,因爲它不是必需的,以確保其正常功能。因此,您需要做一些額外的配置來指導框架來創建和維護它。

<http>標籤內的春季安全配置包括此:

<security:session-management> 
    <security:concurrency-control max-sessions="100"/> 
</security:session-management> 

使用concurrency-control標籤將導致SessionRegistry被正確連接好與框架的其他組件。由於此設備最初開發的目的是允許用戶可能會話數量有限的配置,因此需要設置max-sessions屬性(否則它默認爲1)。如果您不想要這種「副作用」,請給出足夠高的數字。

此外,包括這在你的web.xml

<listener> 
    <listener-class> 
     org.springframework.security.web.session.HttpSessionEventPublisher 
    </listener-class> 
</listener> 

這是需要,使SessionRegistry被當用戶會話結束通知。

之後,不要忘記將@Autowired添加到代碼中SessionRegistry字段的聲明中,或者確保它以其他方式注入。

請閱讀參考文檔的short chapter以獲取有關Spring Security會話管理的更多信息。

+0

謝謝你這個很好的解釋。但我仍然得到這個異常:java.lang.NullPointerException在這個sessionRegistry.getAllSessions(「userName」,true); – loulou 2013-05-03 16:20:36

+0

如果您分享更多的代碼和配置,我們只能幫助您。你試着做什麼來確保'sessionRegistry'被實際注入到你的類中?你的類是否實例化爲spring bean?你是否自動裝入了'sessionRegistry'或使用過的屬性/構造函數注入?什麼是你的安全配置?等等請用相關的細節更新你的問題。 – zagyi 2013-05-03 21:27:55