設置登錄過期時間的正確姿勢 - 第27篇

需求緣起

有網友在公衆號文章下留言:怎麼設置登錄過期時間,搞了好久找過不少資料就是沒看到,樓主指點一下~

博主回覆: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分鐘。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章