2017-08-08 110 views
4

我需要一個選項來設置會話超時從GUI。目前我們可以使用配置全局更改會話超時春季安全與自定義會話超時

server.session.timeout=120 
server.session.cookie.max-age=120 
server.session.timeout=120` 

此外,我們可以爲每個會話設置會話超時。

session.setMaxInactiveInterval(120); 

但發現沒有選項可全局設置會話超時。有沒有辦法做到這一點使用彈簧啓動

在此先感謝

+2

你看過例子spring jdb c會話。 https://github.com/spring-projects/spring-session/blob/master/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcOperationsSessionRepository.java 在那裏你可以配置最大空閒超時。 –

+0

春季安全中是否有任何選項可以創建自定義會話? –

+2

也許這兩個組合:https://stackoverflow.com/questions/5385175/setting-session-timeout-period-with-spring-security-3-0(如何設置超時)和https:// stackoverflow。 com/questions/7342936/how-to-get-session-information-in-spring-mvc-3(如何從控制器獲取會話) – Brian

回答

2

我想你可能需要使用JDBC春季會議或Redis的會話,以便您可以有超過會話存儲的完全控制。

春季啓動JDBC會議給出了使用,我們可以設置從控制器空閒超時豆

@Autowired JdbcOperationsSessionRepository sessionRepository;

只需添加依賴關係,然後爲您的配置添加@EnableJdbcHttpSession。

http://docs.spring.io/spring-session/docs/current/reference/html5/guides/httpsession-jdbc-boot.html#httpsession-jdbc-boot-sample

不過貌似不會自動創建的會話表,你男人需要手動創建表。你可以找到在

組織/ springframework的/會話/ JDBC /架構聲明 - * SQL

http://docs.spring.io/spring-session/docs/current/api/org/springframework/session/jdbc/JdbcOperationsSessionRepository.html

編輯:1

即使JDBC會議提供了一種方法來設置全局默認的超時,我發現它不能正常工作。似乎唯一的解決辦法是在用戶首次使用以下代碼登錄時設置會話超時。實現這一

session.setMaxInactiveInterval(120); 
0

方式一:

  1. 堅持用戶的登錄時間。
  2. 以某種頻率,例如30秒,從GUI向服務器發出ajax ping請求。
  3. 獲取來自會話的用戶和他的會話超時間隔時,ping請求的用武之地。
  4. 與當前時間比較它,如果間隔超過 到期了會議。

下面的代碼無效當前用戶的HTTP會話:

public static void customLogout(HttpServletRequest request, HttpServletResponse response){ 

     CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY); 

     SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler(); 

     cookieClearingLogoutHandler.logout(request, response, null); 

     securityContextLogoutHandler.logout(request, response, null); 

    } 
-1

下面的辦法將更加優化:

  • 堅持用戶登錄時
  • 運行一個cron每5秒(根據您的要求)檢查過期的會話(即t他會話在閾值時間之後仍然存在)並將其標記爲過期。
  • (可選)發佈一條消息給Faye,該消息應該通知UI(UI應實現對Faye的訂閱)會話已過期。

你可以使用這樣的到期令牌:

public void expireToken (HttpServletRequest request, HttpServletResponse response){ 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    if (auth != null){  
     SecurityContextHolder.getContext().setAuthentication(null); 
    } 
} 

要獲取所有當前會話,你可以使用以下命令:

public class UserController { 
    @Autowired 
    private SessionRegistry sessionRegistry; 

    public void listLoggedInUsers() { 
     final List<Object> allPrincipals = sessionRegistry.getAllPrincipals(); 

     for(final Object principal : allPrincipals) { 
      if(principal instanceof SecurityUser) { 
       final SecurityUser user = (SecurityUser) principal; 

       // if currentTime > logInTime + threshold time 
       expireToken(); 
      } 
     } 
    } 
} 

注:我個人避免從前端輪詢後端,因爲它聽起來不是一個最佳方法