中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?session如何實現Session共享

發布時間:2023-04-15 14:11:19 來源:億速云 閱讀:88 作者:iii 欄目:開發技術

這篇文章主要介紹“Spring session如何實現Session共享”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring session如何實現Session共享”文章能幫助大家解決問題。

Redis session

用戶第一次訪問應用,會創建一個新的Session,并且會將Session的ID作為Cookie緩存在瀏覽器。下一次訪問請求時,請求的頭部會帶有Cookie。應用通過Session ID進行查找。如果Session存在并且有效,就會繼續請求。

為什么使用session共享:

如果沒有Session共享,session的信息放在內存中,如果Tomcat關閉,內存中的Session就會銷毀。在多實例(多個Tomcat)中無法共享,導致一個用戶只能訪問一個實例。

在實現共享后,只要Cookie中的Session ID 無法改變,多實例的任意一個被銷毀,都不會影響用戶訪問。

  • 有了session共享,即使服務器重啟也不需要重新登錄。

  • 假設某個網站是由多臺服務器提供服務,nginx采用輪詢機制做負載均衡,那么同一個IP訪問該網站時,請求就可能會被分配到不同的服務器上,如果 session 沒有 實現共享 ,就會出現重復登陸授權的情況。

  • 注意,瀏覽器不能關閉,因為瀏覽器的cookie是會話級別的,瀏覽器關閉就會失效。

session 共享原理:

當請求進來的時候,SessionRepositoryFilter 會先攔截到請求,將 request 和 response 對象轉換成 SessionRepositoryRequestWrapper 和 SessionRepositoryResponseWrapper 。后續當第一次調用 request 的getSession方法時,會調用SessionRepositoryRequestWrapper 的getSession方法。這個方法是被重寫過的,邏輯是先從 request 的屬性中查找,如果找不到;再查找一個key值是"SESSION"的 Cookie,通過這個 Cookie 拿到 SessionId 去 Redis 中查找,如果查不到,就直接創建一個RedisSession 對象,同步到 Redis 中。

說的簡單點就是:攔截請求,將之前在服務器內存中進行 Session 創建銷毀的動作,改成在 Redis 中創建。

Spring Session提供了一套創建和管理Servlet HTTPSession的方案,Spring Session提供了集群Session功能,默認采用外置的Redis來存儲Session數據,以此來解決Session共享問題。

使用過濾器攔截請求

<!-- spring session共享filter -->
  <!-- 該過濾器必須是第一個過濾器,所有的請求經過該過濾器后執行后續操作 -->
  <filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

配置Redis

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                         http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--Jedis連接池的相關配置-->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!--最大連接數, 默認8個-->
        <property name="maxTotal" value="100"></property>
        <!--最大空閑連接數, 默認8個-->
        <property name="maxIdle" value="50"></property>
        <!--允許借調 在獲取連接的時候檢查有效性, 默認false-->
        <property name="testOnBorrow" value="true"/>
        <!--允許歸還 在return給pool時,是否提前進行validate操作-->
        <property name="testOnReturn" value="true"/>
    </bean>
    <!--配置JedisConnectionFactory-->
    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="192.168.175.100"/>
        <property name="port" value="6379"/>
        <property name="database" value="0"/>
        <property name="poolConfig" ref="jedisPoolConfig"/>
    </bean>
    <!-- 配置session共享 -->
    <bean id="redisHttpSessionConfiguration"
          class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="600" />
    </bean>
</beans>

關于“Spring session如何實現Session共享”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

怀集县| 金山区| 新疆| 吴堡县| 万全县| 南阳市| 陆河县| 曲周县| 轮台县| 郴州市| 平阴县| 江华| 成武县| 朔州市| 德昌县| 中方县| 巩留县| 宁安市| 怀集县| 石嘴山市| 婺源县| 营山县| 革吉县| 图木舒克市| 兴文县| 江门市| 义马市| 潮安县| 兰考县| 将乐县| 东海县| 偏关县| 黄浦区| 全椒县| 邯郸县| 墨玉县| 黄冈市| 昌图县| 丰原市| 淮北市| 成安县|