日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring Session的使用示例

瀏覽:36日期:2023-07-09 08:18:30
目錄SessionSession常用解決方案Spring-Session測試代碼基于數據庫的Spring-Session基于Redis的Spring-Session總結Session

Http協議是無狀態的,這樣對于服務端來說,沒有辦法區分是新的訪客還是舊的訪客。但是,有些業務場景,需要追蹤用戶多個請求,此時就需要Session。關于session的百度百科session

Session:在計算機中,尤其是在網絡應用中,稱為“會話控制”。Session對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的Web頁之間跳轉時,存儲在Session對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web頁時,如果該用戶還沒有會話,則Web服務器將自動創建一個 Session對象。當會話過期或被放棄后,服務器將終止該會話

核心特點:

服務端存儲 會過期Session常用解決方案

對于Session的常用解決方案,可以劃分為三種。

負載均衡方式

借助負載均衡設備或者模塊,將指定的Session始終路由到同一臺機器即可,如Nginx。

副本復制方式

利用服務器節點間的副本復制方式,保證集群所有節點擁有的Session數據一致。

集中存儲方式

引入第三方存儲,將Session數據集中存儲到外部存儲中,如Redis或者數據庫等。

本文介紹的Spring-Session是采用第三種,集中存儲的方式。

Spring-Session

核心組成模塊

Spring Session Core

提供Spring Session核心的功能和API

Spring Session Data Redis

提供基于Redis的SessionRepository以及配置

Spring Session JDBC

提供基于關系型數據庫的SessionRepository以及配置

Spring Session Hazelcast

提供基于Hazelcast的SessionRepository以及配置

測試代碼

controller提供三個接口,分別對應Session的獲取、保存和清理

@GetMapping('/')public String process(Model model, HttpSession session) { @SuppressWarnings('unchecked') List<String> messages = (List<String>) session.getAttribute('springSession'); if (messages == null) { messages = new ArrayList<>(); } model.addAttribute('sessionMessages', messages); return 'sessionTest';}@PostMapping('/persistSession')public String persistMessage(@RequestParam('msg') String msg, HttpServletRequest request) { @SuppressWarnings('unchecked') List<String> messages = (List<String>) request.getSession().getAttribute('springSession'); if (messages == null) { messages = new ArrayList<>(); request.getSession().setAttribute('springSession', messages); } messages.add(msg); request.getSession().setAttribute('springSession', messages); return 'redirect:/';}@PostMapping('/destroySession')public String destroySession(HttpServletRequest request) { request.getSession().invalidate(); return 'redirect:/';}

sessionTest.html對應頁面操作

<!DOCTYPE html><html lang='en' xmlns:th='http://www.thymeleaf.org'><head> <meta charset='UTF-8'> <title>Spring Boot Session Example</title></head><body><div> <form th:action='@{/persistSession}' method='post'><textarea name='msg' cols='40' rows='2'></textarea><br> <input type='submit' value='保存' /> </form></div><div> <h2>session列表</h2> <ul th:each='message : ${sessionMessages}'><li th:text='${message}'>message</li> </ul></div><div> <form th:action='@{/destroySession}' method='post'><input type='submit' value='清空' /> </form></div></body></html>

Spring Session的使用示例

基于數據庫的Spring-Session

1.引入maven依賴

使用MySQL存儲,所以引入了MySQL。

涉及到SpringBoot JDBC的配置,引入了Spring Boot JDBC Starter。

<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> <version>2.5.0</version></dependency><dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-jdbc</artifactId> <version>2.5.0</version></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependency>

注意:

No session repository could be auto-configured, check your configuration (session store type is ’jdbc’)

如果存在這個報錯,是因為沒有引入spring-boot-starter-jdbc,引入即可。

2.配置application.properties文件

主要包含兩部分,數據庫的配置以及Spring Session Jdbc配置。

# 配置數據源相關內容spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/spring_learn?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=falsespring.datasource.username=xxxspring.datasource.password=xxxspring.datasource.initialization-mode=always# session類型選擇jdbcspring.session.store-type=jdbcspring.session.jdbc.initialize-schema=always# 指定表名#spring.session.jdbc.table-name=SESSIONS# 超時時間spring.session.timeout=180s

3.數據庫存儲解析

默認情況下,數據庫中會創建2張表。SPRING_SESSION和SPRING_SESSION_ATTRIBUTION。

SPRING_SESSION用于存在session自身的一些屬性,如創建時間、過期時間等,詳細schema如下。

CREATE TABLE `SPRING_SESSION` ( `PRIMARY_ID` char(36) NOT NULL, `SESSION_ID` char(36) NOT NULL, `CREATION_TIME` bigint NOT NULL, `LAST_ACCESS_TIME` bigint NOT NULL, `MAX_INACTIVE_INTERVAL` int NOT NULL, `EXPIRY_TIME` bigint NOT NULL, `PRINCIPAL_NAME` varchar(100) DEFAULT NULL, PRIMARY KEY (`PRIMARY_ID`), UNIQUE KEY `SPRING_SESSION_IX1` (`SESSION_ID`), KEY `SPRING_SESSION_IX2` (`EXPIRY_TIME`), KEY `SPRING_SESSION_IX3` (`PRINCIPAL_NAME`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC

SPRING_SESSION_ATTRIBUTION用于存儲session相關聯的屬性,schema如下。

CREATE TABLE `SPRING_SESSION_ATTRIBUTES` ( `SESSION_PRIMARY_ID` char(36) NOT NULL, `ATTRIBUTE_NAME` varchar(200) NOT NULL, `ATTRIBUTE_BYTES` blob NOT NULL, PRIMARY KEY (`SESSION_PRIMARY_ID`,`ATTRIBUTE_NAME`), CONSTRAINT `SPRING_SESSION_ATTRIBUTES_FK` FOREIGN KEY (`SESSION_PRIMARY_ID`) REFERENCES `SPRING_SESSION` (`PRIMARY_ID`) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC

4.測試執行

SPRING_SESSION中的數據

Spring Session的使用示例

SPRING_SESSION_ATTRIBUTION中的數據。

Spring Session的使用示例

基于Redis的Spring-Session

幾乎同樣的步驟

maven依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId></dependency>

application.properties配置

spring.session.store-type=redisspring.redis.host=127.0.0.1spring.redis.port=6379

結果分析

一次請求后,多了三個屬性,分析如下。

key 類型 用途 value spring:session:sessions:expires:${sessionId} string 判斷sesssion是否存在 空 spring:session:sessions:${sessionId} hash session相關的屬性,包括有效期、創建時間、具體屬性等 creationTime/lastAccessedTime/sessionAttr/maxInactiveInterval spring:session:expirations:1623656160000 set 存儲待過期的sessionId列表 key: 過期的時間戳;value: 在這個時間戳將要過期的expire key列表。

在訪問時,先通過第一個key,判斷session是否存在以及是否過期。如果沒有過期,可以通過第二個key獲取或者更新對應的session詳情。

對于第三個key,實際上Spring-Session-Redis會有特殊的用途,主要是為了Redis的keySpace-notificationhttps://redis.io/topics/notifications。核心目的是為了確保過期的session一定要觸發過期事件。關于這方面的解釋,可以看一下RedisIndexedSessionRepository中的注釋。

訂閱Spring-Session的相關事件

有些時候,我們比較關心Session的創建或者銷毀事件,做一些特殊的處理或者記錄。基于Redis的Spring-Session利用Spring Event將該事件發布出來,我們可以使用EventListener監聽做處理。

@Component@Slf4jpublic class AnnotationDrivenEventListener { @EventListener public void handleSessionCreated(SessionCreatedEvent sessionCreatedEvent) { String sessionId = sessionCreatedEvent.getSessionId(); log.info('session id:{} created', sessionId); } @EventListener public void handleSessionDestroyed(SessionDestroyedEvent sessionDestroyedEvent) { String sessionId = sessionDestroyedEvent.getSessionId(); log.info('session id:{} destroyed', sessionId); }}總結

Spring Session提供了非常便利的,基于關系型數據庫或者Redis的Session解決方案。

Redis版訪問速度快,基于Redis的過期策略,保證過期數據會被刪除,同時支持事件訂閱。

數據庫版直接基于數據庫,無需單獨引入其他存儲。但是訪問速度相對較慢,過期數據需要依賴應用程序自身進行刪除。同時沒有提供事件訂閱能力。

以上就是Spring Session的使用示例的詳細內容,更多關于Spring Session的使用的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜精品影院| 在线天堂中文资源最新版| 神马日本精品| 国产成人精品一区二区三区在线| 欧美久久久网站| 热久久久久久| 91成人小视频| 欧美国产日韩电影| 国产三级一区| 日本va欧美va瓶| 婷婷亚洲精品| 青青青国产精品| 国产精品视频一区视频二区| 国产精品免费不| 精品国产三区在线| 国产伦久视频在线观看| 亚洲欧美网站在线观看| 日韩欧美久久| 国产精品三级| 国产精品成久久久久| 不卡福利视频| 狠狠爱成人网| 亚洲欧洲专区| 国产精品久久久久av蜜臀| 国产视频一区二区在线播放| 国产精品一区二区三区www| 国产福利一区二区三区在线播放| 久久男女视频| 久久最新视频| 国产欧美欧美| 国产精品蜜月aⅴ在线| 国产日产精品_国产精品毛片 | 亚洲色图综合| 日本国产欧美| 精品精品国产三级a∨在线| 欧美久久天堂| 亚洲免费一区二区| 久久国产婷婷国产香蕉| 91久久亚洲| 国产欧美日韩一级| 精品免费av在线| 久久国产精品毛片| 国产免费av一区二区三区| 肉色欧美久久久久久久免费看| 伊人久久成人| 日韩综合小视频| 国产 日韩 欧美 综合 一区| 亚洲欧洲另类| 国产精品一区二区中文字幕| 91精品啪在线观看国产18| 蜜桃av一区二区在线观看| 老司机免费视频一区二区| 午夜欧美理论片| 国产精品亲子伦av一区二区三区 | 久久精品国产999大香线蕉| 午夜精品一区二区三区国产| 91成人在线| 亚洲午夜精品久久久久久app| 亚洲综合中文| 国产91在线播放精品| 蜜臀国产一区二区三区在线播放| 精品国产亚洲一区二区三区在线 | 国产精品久久久久久久免费观看 | 亚洲免费影院| 美女视频黄 久久| 伊人久久成人| 激情久久99| 四虎8848精品成人免费网站 | 好看的亚洲午夜视频在线| 国产精品免费不| 日韩成人精品一区| 视频小说一区二区| 国产精品久久久一区二区| 九九久久婷婷| 麻豆精品一区二区综合av| 五月天综合网站| 激情久久一区二区| 日韩成人一级| 婷婷综合五月| 97国产精品| 欧美日本一区| 国产精品免费看| 亚洲风情在线资源| 国产精品一区二区三区av麻| 男女男精品视频网| 在线一区视频观看| 麻豆国产一区| 日韩精品社区| 伊人精品视频| 日韩三区在线| 国产精品夜夜夜| 视频一区中文字幕精品| 亚洲成人一区| 久久国产免费| 国产黄大片在线观看| 欧美专区一区| 中文字幕成人| 六月天综合网| 91精品一区二区三区综合在线爱| 六月丁香综合在线视频| 日本特黄久久久高潮| 亚洲欧美日韩国产一区二区| 欧洲在线一区| а√天堂中文在线资源8| 久久精品福利| 日韩欧美中文字幕一区二区三区| 蜜桃久久久久久| 国产亚洲综合精品| 欧美精品一区二区三区精品| 日本国产精品| 日韩中文欧美| 欧美日韩尤物久久| 久久精品国内一区二区三区水蜜桃| 美女久久久精品| 国产精品毛片aⅴ一区二区三区| 日本aⅴ精品一区二区三区| 日本亚州欧洲精品不卡| 亚洲三级在线| 亚洲香蕉视频| 国产精品日本欧美一区二区三区| 日韩欧美二区| 老牛国内精品亚洲成av人片| 国产精品香蕉| 国产毛片精品| 国产日产精品_国产精品毛片| 青青国产91久久久久久| 亚洲精品第一| 日韩欧美美女在线观看| 日韩高清二区| 日本午夜精品视频在线观看| 日本aⅴ亚洲精品中文乱码| 午夜精品影视国产一区在线麻豆| 在线一区二区三区视频| 亚洲毛片视频| 日韩高清中文字幕一区| 亚洲天堂免费| 日本在线不卡视频一二三区| 日韩av二区在线播放| 91麻豆精品激情在线观看最新| 欧美日本精品| 久久精品国产99国产| 一区二区三区四区日本视频| 日韩一区二区三区免费播放| 国产亚洲一区二区手机在线观看| 亚洲播播91| 黄色不卡一区| 中文字幕成人| 国产精品一级| 国产一区二区三区不卡视频网站 | 欧美国产先锋| 高清不卡一区| 91精品一区二区三区综合在线爱| 99久精品视频在线观看视频| 欧美午夜不卡| 蜜乳av另类精品一区二区| 亚洲精品大片| 久久久精品国产**网站| 成人日韩在线观看| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲香蕉视频| 久久亚洲黄色| 欧美va天堂| 亚洲综合专区| 精品视频91| 蜜桃国内精品久久久久软件9| 石原莉奈一区二区三区在线观看| 日本h片久久| 黄色在线网站噜噜噜| 9色国产精品| 人人精品人人爱| 美女在线视频一区| 欧美亚洲激情| 日韩欧美美女在线观看| 国产一区二区三区91| 欧美日韩国产免费观看| 日韩精品免费视频人成| 粉嫩av一区二区三区四区五区 | 国产二区精品| 欧美日韩国产免费观看| 日韩黄色av| 日韩中文首页| 日韩在线观看一区二区三区| 精品99在线| 一区在线免费| 国产高清精品二区| 99视频精品| 麻豆国产欧美日韩综合精品二区| 国产精品7m凸凹视频分类| 日韩激情中文字幕| 狠狠躁少妇一区二区三区| 综合干狼人综合首页| 成人在线免费观看91| 亚洲一区激情| 国产在线视频欧美一区| 蜜臀av亚洲一区中文字幕| 精品一区二区三区在线观看视频| 欧美日韩视频| 久久伊人国产| 亚洲精品系列| 激情欧美一区|