日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Re:从零开始的Spring Session(二)

發布時間:2024/4/17 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Re:从零开始的Spring Session(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

?

上一篇文章介紹了一些Session和Cookie的基礎知識,這篇文章開始正式介紹Spring Session是如何對傳統的Session進行改造的。官網這么介紹Spring Session:

Spring Session provides an API and implementations for managing a user’s session information. It also provides transparent integration with:

  • HttpSession?- allows replacing the HttpSession in an application container (i.e. Tomcat) neutral way. Additional features include:
    • Clustered Sessions?- Spring Session makes it trivial to support?clustered sessions?without being tied to an application container specific solution.
    • Multiple Browser Sessions?- Spring Session supports?managing multiple users’ sessions?in a single browser instance (i.e. multiple authenticated accounts similar to Google).
    • RESTful APIs?- Spring Session allows providing session ids in headers to work with?RESTful APIs
  • WebSocket?- provides the ability to keep the?HttpSession?alive when receiving WebSocket messages

其具體的特性非常之多,具體的內容可以從文檔中了解到,筆者做一點自己的總結,Spring Session的特性包括但不限于以下:

  • 使用GemFire來構建C/S架構的httpSession(不關注)
  • 使用第三方倉儲來實現集群session管理,也就是常說的分布式session容器,替換應用容器(如tomcat的session容器)。倉儲的實現,Spring Session提供了三個實現(redis,mongodb,jdbc),其中redis使我們最常用的。程序的實現,使用AOP技術,幾乎可以做到透明化地替換。(核心)
  • 可以非常方便的擴展Cookie和自定義Session相關的Listener,Filter。
  • 可以很方便的與Spring Security集成,增加諸如findSessionsByUserName,rememberMe,限制同一個賬號可以同時在線的Session數(如設置成1,即可達到把前一次登錄頂掉的效果)等等

介紹完特性,下面開始一步步集成Spring Session

##使用Redis集成Spring Session

  • 引入依賴,Spring Boot的版本采用1.5.4

    1
    2
    3
    4
    5
    6
    7
    8
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    </dependency>
  • 配置

    配置類開啟Redis Http Session

    1
    2
    3
    4
    5
    @Configuration
    @EnableRedisHttpSession
    public class HttpSessionConfig {

    }

    基本是0配置,只需要讓主配置掃描到@EnableRedisHttpSession即可

    配置文件application.yml,配置連接的redis信息

    1
    2
    3
    4
    5
    spring:
    redis:
    host: localhost
    port: 6379
    database: 0
  • 編寫測試Controller,以便于觀察Spring Session的特性,和前一篇文章使用同樣的代碼

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @Controller
    public class CookieController {

    @RequestMapping("/test/cookie")
    public String cookie(@RequestParam("browser") String browser, HttpServletRequest request, HttpSession session) {
    //取出session中的browser
    Object sessionBrowser = session.getAttribute("browser");
    if (sessionBrowser == null) {
    System.out.println("不存在session,設置browser=" + browser);
    session.setAttribute("browser", browser);
    } else {
    System.out.println("存在session,browser=" + sessionBrowser.toString());
    }
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0) {
    for (Cookie cookie : cookies) {
    System.out.println(cookie.getName() + " : " + cookie.getValue());
    }
    }
    return "index";
    }
    }

啟動類省略,下面開始測試。

在瀏覽器中訪問如下端點:http://localhost:8080/test/cookie?browser=chrome,下面是連續訪問4次的結果

1
2
3
4
5
6
7
1 不存在session,設置browser=chrome
2 存在session,browser=chrome
SESSION : 70791b17-83e1-42db-8894-73fbd2f2a159
3 存在session,browser=chrome
SESSION : 70791b17-83e1-42db-8894-73fbd2f2a159
4 存在session,browser=chrome
SESSION : 70791b17-83e1-42db-8894-73fbd2f2a159

如果還記得上一篇文章中運行結果的話,會發現和原生的session管理是有一些差別,原先的信息中我們記得Cookie中記錄的Key值是JSESSIONID,而替換成RedisHttpSession之后變成了SESSION。接著觀察redis中的變化:



redis中的session

解析一下這個redis store,如果不糾結于細節,可以跳過,不影響使用。

?1 spring:session是默認的Redis HttpSession前綴(redis中,我們常用’:’作為分割符)。

2 每一個session都會有三個相關的key,第三個key最為重要,它是一個HASH數據結構,將內存中的session信息序列化到了redis中。如上文的browser,就被記錄為sessionAttr:browser=chrome,還有一些meta信息,如創建時間,最后訪問時間等。

3 另外兩個key,expirations:1504446540000和sessions:expires:7079…我發現大多數的文章都沒有對其分析,前者是一個SET類型,后者是一個STRING類型,可能會有讀者發出這樣的疑問,redis自身就有過期時間的設置方式TTL,為什么要額外添加兩個key來維持session過期的特性呢?這需要對redis有一定深入的了解才能想到這層設計。當然這不是本節的重點,簡單提一下:redis清除過期key的行為是一個異步行為且是一個低優先級的行為,用文檔中的原話來說便是,可能會導致session不被清除。于是引入了專門的expiresKey,來專門負責session的清除,包括我們自己在使用redis時也需要關注這一點。在開發層面,我們僅僅需要關注第三個key就行了。

總結

本節主要講解了Spring Boot如何集成Spring Session,下一節將介紹更加復雜的特性。包括自定義Cookie序列化策略,與Spring Security的集成,根據用戶名查找session等特性以及使用注意點。

?

https://www.cnkirito.moe/spring-session-2/

?

轉載于:https://www.cnblogs.com/softidea/p/10323285.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Re:从零开始的Spring Session(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。