SpringBoot设置Session失效时间

springboot的yml文件中设置session的过期时间

 #Session超时时间设置,单位是秒,默认是30分钟
  servlet:
    session:
      timeout: 3600s

当过期时间是大于1分钟的时候是没有什么问题的,但是如果设置过期时间小于1分钟,就会失效。

  servlet:
    session:
      timeout: 10

因为SpringBoot在TomcatServletWebServerFactory为session的过期时间做了优化。

Session的配置configureSession

private void configureSession(Context context) {
        long sessionTimeout = this.getSessionTimeoutInMinutes();
        context.setSessionTimeout((int)sessionTimeout);
        Boolean httpOnly = this.getSession().getCookie().getHttpOnly();
        if (httpOnly != null) {
            context.setUseHttpOnly(httpOnly);
        }

        if (this.getSession().isPersistent()) {
            Manager manager = context.getManager();
            if (manager == null) {
                manager = new StandardManager();
                context.setManager((Manager)manager);
            }

            this.configurePersistSession((Manager)manager);
        } else {
            context.addLifecycleListener(new TomcatServletWebServerFactory.DisablePersistSessionListener());
        }

    }

我们看到long sessionTimeout = this.getSessionTimeoutInMinutes();过期时间取自getSessionTimeoutInMinutes方法。

    private long getSessionTimeoutInMinutes() {
        Duration sessionTimeout = this.getSession().getTimeout();
        return this.isZeroOrLess(sessionTimeout) ? 0L : Math.max(sessionTimeout.toMinutes(), 1L);
    }

在这里对sessionTimeout 进行判断,首先判断是否为0或者更少isZeroOrLess方法

    private boolean isZeroOrLess(Duration sessionTimeout) {
        return sessionTimeout == null || sessionTimeout.isNegative() || sessionTimeout.isZero();
    }

sessionTimeout转换为分钟sessionTimeout.toMinutes()

    public long toMinutes() {
        return seconds / SECONDS_PER_MINUTE;
    }

    /**
     * Seconds per minute.
     */
    static final int SECONDS_PER_MINUTE = 60;

将转换后的值和1L进行比较

    public static long max(long a, long b) {
        return (a >= b) ? a : b;
    }

如果该值小于1分钟,则按1分钟算。
最后返回的是三目运算的结果。

posted @ 2024-05-23 10:51  leepandar  阅读(81)  评论(0编辑  收藏  举报