最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解SpringBoot中Session超時(shí)原理說明

 更新時(shí)間:2017年08月30日 14:48:10   作者:james__Gao  
本篇文章主要介紹了詳解SpringBoot中Session超時(shí)原理說明,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

一:前言:

最近支付后臺(tái)登錄一段時(shí)間后如果沒有任何操作,總是需要重新登錄才可以繼續(xù)訪問頁面,出現(xiàn)這個(gè)問題的原因就是session超時(shí),debug代碼后發(fā)現(xiàn)session的超時(shí)時(shí)間是1800s。也就是說當(dāng)1800秒內(nèi)沒有任何操作,session就會(huì)出現(xiàn)超時(shí)現(xiàn)象。那這個(gè)超時(shí)時(shí)間是如何設(shè)置的呢?然后該如何重新設(shè)置此超時(shí)時(shí)間呢?系統(tǒng)又如何判斷session超時(shí)的呢?接下來就一一進(jìn)行解答。

二:系統(tǒng)session超時(shí)時(shí)間如何默認(rèn)的?

說明:獲取session超時(shí)時(shí)間的方法為”request.getSession().getMaxInactiveInterval()",但是tomcat中設(shè)置超時(shí)時(shí)間的參數(shù)為“sessionTimeout”,那么他們是怎么聯(lián)系起來的呢?

第一步:加載sessionTimeout參數(shù)。

1、項(xiàng)目運(yùn)行初始化通過“@ConfigurationProperties”注解加載“org.springframework.boot.autoconfigure.web.ServerProperties”類。

//springBoot中默認(rèn)的配置文件為"application.yml"或者"application.perties"文件,也就是說server是其中的一個(gè)配置參數(shù)。
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties
  implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered {
//代碼
}

2、上面類中“ServerProperties”繼承自“EmbeddedServletContainerCustomizer”接口。重寫customize方法,之后在此方法中“向上推”,即可找到“AbstractConfigurableEmbeddedServletContainer  ”類。

@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
 //多個(gè)參數(shù)判斷,如果在application中沒配置的情況下都是null
 if (getPort() != null) {
  container.setPort(getPort());
 }
 ...//n多個(gè)參數(shù)判斷,
 //以下的代碼就是重點(diǎn),因?yàn)槭莟omcat容器,所以以下條件為“真”,經(jīng)過一系列的查找父類或者實(shí)現(xiàn)接口即可找到抽象類“AbstractConfigurableEmbeddedServletContainer”
 //public class TomcatEmbeddedServletContainerFactory extends AbstractEmbeddedServletContainerFactory implements ResourceLoaderAware
 //public abstract class AbstractEmbeddedServletContainerFactory extends AbstractConfigurableEmbeddedServletContainer implements EmbeddedServletContainerFactory 
 if (container instanceof TomcatEmbeddedServletContainerFactory) {
  getTomcat().customizeTomcat(this,
   (TomcatEmbeddedServletContainerFactory) container);
 }
//以上代碼執(zhí)行完成之后,實(shí)際上已經(jīng)有對(duì)應(yīng)的session所有的默認(rèn)參數(shù),之后通過下面方法,將所有參數(shù)放入對(duì)應(yīng)的容器中。第3、4步就是設(shè)置過程
 container.addInitializers(new SessionConfiguringInitializer(this.session));
}

3、在“AbstractConfigurableEmbeddedServletContainer”類中終于可以找到“超時(shí)時(shí)間”的相關(guān)設(shè)置

//重要代碼
//45行
private static final int DEFAULT_SESSION_TIMEOUT = (int) TimeUnit.MINUTES
  .toSeconds(30);
//66行
private int sessionTimeout = DEFAULT_SESSION_TIMEOUT;
 
@Override
public void setSessionTimeout(int sessionTimeout) {
 this.sessionTimeout = sessionTimeout;
}
//171-188行
@Override
public void setSessionTimeout(int sessionTimeout, TimeUnit timeUnit) {
 Assert.notNull(timeUnit, "TimeUnit must not be null");
 this.sessionTimeout = (int) timeUnit.toSeconds(sessionTimeout);
}

/**
 * Return the session timeout in seconds.
 * @return the timeout in seconds
 */
public int getSessionTimeout() {
 return this.sessionTimeout;
}

4、執(zhí)行第2步的”Container.addInitializers(new SessionConfiguringInitializer(this.session))“加載所有的配置參數(shù)。

public static class Session {

 /**
 * Session timeout in seconds.
 */
 private Integer timeout;

 public Integer getTimeout() {
  return this.timeout;
 }
//將session超時(shí)時(shí)間設(shè)置進(jìn)來
 public void setTimeout(Integer sessionTimeout) {
  this.timeout = sessionTimeout;
 }

第二步:將上面的超時(shí)時(shí)間賦值給“MaxInactiveInterval”參數(shù)。

說明:既然上面tomcat需要的參數(shù)都已經(jīng)加載完成,那么接下來就會(huì)運(yùn)行tomcat,此處不做細(xì)講,直接進(jìn)入tomcat啟動(dòng)和加載參數(shù)說明。在“TomcatEmbeddedServletContainerFactory”類中的方法調(diào)用流程如下:

getEmbeddedServletContainer--》prepareContext--》configureContext--》configureSession--》getSessionTimeoutInMinutes。

1、調(diào)用configureSession設(shè)置tomcat的Session配置參數(shù)。

//以下代碼
private void configureSession(Context context) {
 long sessionTimeout = getSessionTimeoutInMinutes();
 context.setSessionTimeout((int) sessionTimeout);
 Manager manager = context.getManager();
 if (manager == null) {
  manager = new StandardManager();
  //此處即為設(shè)置相應(yīng)的參數(shù)的位置。之后會(huì)調(diào)用StandardContext類的setManger(Manager)方法,在setManger中會(huì)調(diào)用"manager.setContext(this)"
  context.setManager(manager);
 }
}
//計(jì)算超時(shí)時(shí)間為分鐘(注意:此處會(huì)將之前的1800秒,轉(zhuǎn)換為30分鐘)??梢钥闯鲎罱K的時(shí)間結(jié)果是個(gè)整數(shù)的分鐘類型,也就是說如果設(shè)置的超時(shí)時(shí)間(單位為秒)不是60的倍數(shù),也會(huì)最終轉(zhuǎn)換為60的倍數(shù),并且最小超時(shí)時(shí)間設(shè)置的是60秒。
private long getSessionTimeoutInMinutes() {
 long sessionTimeout = getSessionTimeout();
 if (sessionTimeout > 0) {
  sessionTimeout = Math.max(TimeUnit.SECONDS.toMinutes(sessionTimeout), 1L);
 }
 return sessionTimeout;
}

2、最終將SessionTimeout賦值給MaxInactiveInterval。終于完成session超時(shí)時(shí)間設(shè)置。

//以下代碼
@Override
public void setContext(Context context) {
 //省略其余設(shè)置代碼,直接重新設(shè)置Session超時(shí)時(shí)間,此時(shí)又將上面的分鐘單位轉(zhuǎn)為秒。此時(shí)終于給Sesseion設(shè)置了默認(rèn)超時(shí)時(shí)間。
 if (this.context != null) {
  setMaxInactiveInterval(this.context.getSessionTimeout() * 60);
  this.context.addPropertyChangeListener(this);
 }
}

三:如果自定義超時(shí)時(shí)間呢?

其實(shí)從上面的流程,已經(jīng)不難看出,只需要在“org.springframework.boot.autoconfigure.web.ServerProperties”類中找到對(duì)應(yīng)的Session參數(shù),初始化讓其加載上來即可完成設(shè)置。

/**
 * Get the session timeout.
 * @return the session timeout
 * @deprecated since 1.3.0 in favor of {@code session.timeout}.
 */
@Deprecated
@DeprecatedConfigurationProperty(replacement = "server.session.timeout")
public Integer getSessionTimeout() {
 return this.session.getTimeout();
}

所以在application中配置“server.session.timeout“即可,參數(shù)類型為long類型,單位為”秒“。

四:運(yùn)行程序是如何判斷session超時(shí)的?

其實(shí)很簡(jiǎn)單:只需要在每次本次同一個(gè)sessionequest請(qǐng)求的時(shí)間,和之前的請(qǐng)求時(shí)間進(jìn)行比較,發(fā)現(xiàn)兩個(gè)值的差已經(jīng)大于MaxInactiveInterval的值即可。

//判斷是否超時(shí)
@Override
public boolean isValid() {
 //省略多個(gè)條件判斷
 if (maxInactiveInterval > 0) {
  //判斷此session空閑時(shí)間是否比maxInactiveInterval大,如果大的情況下,session就超時(shí)
  int timeIdle = (int) (getIdleTimeInternal() / 1000L);
  if (timeIdle >= maxInactiveInterval) {
   expire(true);
  }
 }
 return this.isValid;
}
//將上次訪問時(shí)間和當(dāng)前時(shí)間比較,拿到空閑時(shí)間值
@Override
public long getIdleTimeInternal() {
 long timeNow = System.currentTimeMillis();
 long timeIdle;
 if (LAST_ACCESS_AT_START) {
  timeIdle = timeNow - lastAccessedTime;
 } else {
  timeIdle = timeNow - thisAccessedTime;
 }
 return timeIdle;
}

說明:

所以為了保證session超時(shí)時(shí)間長(zhǎng)點(diǎn),可以在application配置文件中配置“server.session.timeout”參數(shù)即可,參數(shù)單位為“秒”,如果參數(shù)不是60的整數(shù)倍,會(huì)轉(zhuǎn)換成60的整數(shù)倍(見二:系統(tǒng)如何設(shè)置超時(shí)時(shí)間、步驟二中的“1”中算法)。如不滿一分鐘,會(huì)轉(zhuǎn)換為60秒。

擴(kuò)展:

實(shí)際上也可以直接重寫EmbeddedServletContainerCustomizer的customize方法進(jìn)行賦值。

 @Bean
 public EmbeddedServletContainerCustomizer containerCustomizer(){
  return new EmbeddedServletContainerCustomizer() {
   @Override
   public void customize(ConfigurableEmbeddedServletContainer container) {
     container.setSessionTimeout(600);//單位為S
   }
  };
 }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body實(shí)現(xiàn)

    SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body實(shí)現(xiàn)

    本文主要介紹了SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Restful傳遞數(shù)組參數(shù)及注解大全

    Restful傳遞數(shù)組參數(shù)及注解大全

    這篇文章主要介紹了Restful傳遞數(shù)組參數(shù)及注解大全的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • MyBatis Generator的簡(jiǎn)單使用方法示例

    MyBatis Generator的簡(jiǎn)單使用方法示例

    這篇文章主要給大家介紹了關(guān)于MyBatis Generator的簡(jiǎn)單使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • springboot獲取真實(shí)ip地址的方法實(shí)例

    springboot獲取真實(shí)ip地址的方法實(shí)例

    在使用springboot時(shí),需要獲取訪問客戶端的IP地址,所以下面這篇文章主要給大家介紹了關(guān)于springboot獲取真實(shí)ip地址的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀

    Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀

    這篇文章主要介紹了Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀,ReentrantLock中的lockInterruptibly()方法使得線程可以在被阻塞時(shí)響應(yīng)中斷,比如一個(gè)線程t1通過lockInterruptibly()方法獲取到一個(gè)可重入鎖,并執(zhí)行一個(gè)長(zhǎng)時(shí)間的任務(wù),需要的朋友可以參考下
    2023-12-12
  • Java中常見的4種限流算法詳解

    Java中常見的4種限流算法詳解

    這篇文章主要介紹了Java中常見的4種限流算法詳解,FixedWindowRateLimiter 類表示一個(gè)固定窗口限流器,使用 limit 和 interval 參數(shù)分別表示限制請(qǐng)求數(shù)量和時(shí)間間隔,缺點(diǎn)是短時(shí)間內(nèi)可能會(huì)流量翻倍,需要的朋友可以參考下
    2023-12-12
  • 詳解Spring Boot2 Webflux的全局異常處理

    詳解Spring Boot2 Webflux的全局異常處理

    這篇文章主要介紹了詳解Spring Boot2 Webflux的全局異常處理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • IDEA中Maven的一些常用操作指南

    IDEA中Maven的一些常用操作指南

    intellij idea是一款很流行好用的集成開發(fā)環(huán)境軟件,maven是使用很廣泛的構(gòu)建工具,java開發(fā)者日常少不了與這兩種工具打交道,下面這篇文章主要給大家介紹了關(guān)于IDEA中Maven的一些常用操作指南,需要的朋友可以參考下
    2024-06-06
  • 利用Java的Struts框架實(shí)現(xiàn)電子郵件發(fā)送功能

    利用Java的Struts框架實(shí)現(xiàn)電子郵件發(fā)送功能

    這篇文章主要介紹了利用Java的Struts框架實(shí)現(xiàn)電子郵件發(fā)送功能,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • 淺談Java中Map和Set之間的關(guān)系(及Map.Entry)

    淺談Java中Map和Set之間的關(guān)系(及Map.Entry)

    這篇文章主要介紹了淺談Java中Map和Set之間的關(guān)系(及Map.Entry),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評(píng)論

巩义市| 桓仁| 安化县| 东城区| 阜南县| 庆元县| 东阳市| 固阳县| 富源县| 常熟市| 温泉县| 丽水市| 榆林市| 蚌埠市| 上虞市| 兴山县| 湄潭县| 天气| 涿鹿县| 绍兴县| 丰县| 论坛| 阿巴嘎旗| 綦江县| 金沙县| 海安县| 海晏县| 南充市| 松阳县| 曲松县| 博罗县| 蒙城县| 城市| 辽阳市| 资阳市| 五大连池市| 雅江县| 鹿泉市| 苍南县| 黄陵县| 当涂县|