2017-08-08 71 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(); 
      } 
     } 
    } 
} 

注:我个人避免从前端轮询后端,因为它听起来不是一个最佳方法