需求緣起
有網友在公衆號文章下留言:怎麼設置登錄過期時間,搞了好久找過不少資料就是沒看到,樓主指點一下~
博主回覆:spring boot 2.x的版本的話,設置屬性:server.servlet.session.timeout=60;1.x的版本的話,設置屬性:server.session.timeout=60;注意時間單位是秒;特別注意的地方:如果設置小於60秒的話,則會默認取1分鐘!
對方回覆:感謝您的回覆,我就是如此設置的,但是似乎沒用,所以想問一下是不是有其他方法
那這是爲什麼呢?這就是本偏博客要解決的問題。
一、設置session的超時時間
設置session的超時時間還是很簡單的,直接在application.properties進行配置即可,當然需要注意Spring Boot的版本:
Spring Boot 1.x配置如下:
server.session.timeout=60
注意時間單位是秒;特別注意的地方:如果設置小於60秒的話,則會默認取1分鐘!
Spring Boot 2.x配置如下:
server.servlet.session.timeout=60
注意時間單位是秒;特別注意的地方:如果設置小於60秒的話,則會默認取1分鐘!
如果設置了這個超時時間,但是到了時間並沒有退出登錄的話,那麼接着往下看吧。
二、設置cookie的超時時間
當配置了“記住我“之後,session超時之後,如果remember-me的cookie並沒有超時的話,還是會自動登錄的,所以此時就需要正確的配置remember-me的超時時間了。
當使用簡單加密token的方式,使用TokenBasedRememberMeServices進行配置:
tokenBasedRememberMeServices.setTokenValiditySeconds(60);
當使用持久化token的方式,在rememberMe()之後進行配置
.and().rememberMe().tokenValiditySeconds(60)
三、題外話:爲什麼session設置了小於60秒會取1分鐘?
我們找到這麼一個類TomcatServletWebServerFactory,裏面有一個配置session的方法:
private void configureSession(Context context) {
long sessionTimeout = getSessionTimeoutInMinutes();
context.setSessionTimeout((int) sessionTimeout);
Boolean httpOnly = getSession().getCookie().getHttpOnly();
if (httpOnly != null) {
context.setUseHttpOnly(httpOnly);
}
if (getSession().isPersistent()) {
Manager manager = context.getManager();
if (manager == null) {
manager = new StandardManager();
context.setManager(manager);
}
configurePersistSession(manager);
}
else {
context.addLifecycleListener(new DisablePersistSessionListener());
}
}
這裏調用了方法:getSessionTimeoutInMinutes():
private long getSessionTimeoutInMinutes() {
Duration sessionTimeout = getSession().getTimeout();
if (isZeroOrLess(sessionTimeout)) {
return 0;
}
return Math.max(sessionTimeout.toMinutes(), 1);
}
這裏看最後return的代碼,就是如果設置的超時時間小於1分鐘的話,那麼就取1分鐘。