具有自定义会话超时的Spring Security

时间:2017-08-08 09:18:03

标签: java session spring-boot spring-security session-timeout

我需要一个从GUI设置会话超时的选项。目前,我们可以使用配置

全局更改会话超时
server.session.timeout=120
server.session.cookie.max-age=120
server.session.timeout=120`

我们也可以为每个会话设置会话超时。

session.setMaxInactiveInterval(120);

但是没有找到全局设置会话超时的选项。有没有办法使用弹簧靴

来做到这一点

提前致谢

2 个答案:

答案 0 :(得分:2)

我认为您可能需要使用spring jdbc session或redis session,以便您可以完全控制会话存储。

Spring boot jdbc session提供了一个bean

@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提供了一种设置全局默认超时的方法,我发现它无法正常工作。似乎唯一的解决方案是在用户首次使用以下代码时设置会话超时。

session.setMaxInactiveInterval(120);

答案 1 :(得分:1)

实现这一目标的一种方法:

  1. 保留用户的登录时间。
  2. 以某个频率(例如30秒)从GUI向服务器发出ajax ping请求。
  3. 在ping请求进入时,从会话中获取用户及其会话超时间隔。
  4. 将其与当前时间进行比较,并在间隔时间内使其会话到期 超过。
  5.   

    以下代码使当前用户的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);
    
        }