电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring Session的使用示例

瀏覽:9日期:2023-07-09 08:18:30
目錄SessionSession常用解決方案Spring-Session測(cè)試代碼基于數(shù)據(jù)庫(kù)的Spring-Session基于Redis的Spring-Session總結(jié)Session

Http協(xié)議是無(wú)狀態(tài)的,這樣對(duì)于服務(wù)端來(lái)說(shuō),沒有辦法區(qū)分是新的訪客還是舊的訪客。但是,有些業(yè)務(wù)場(chǎng)景,需要追蹤用戶多個(gè)請(qǐng)求,此時(shí)就需要Session。關(guān)于session的百度百科session

Session:在計(jì)算機(jī)中,尤其是在網(wǎng)絡(luò)應(yīng)用中,稱為“會(huì)話控制”。Session對(duì)象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息。這樣,當(dāng)用戶在應(yīng)用程序的Web頁(yè)之間跳轉(zhuǎn)時(shí),存儲(chǔ)在Session對(duì)象中的變量將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去。當(dāng)用戶請(qǐng)求來(lái)自應(yīng)用程序的 Web頁(yè)時(shí),如果該用戶還沒有會(huì)話,則Web服務(wù)器將自動(dòng)創(chuàng)建一個(gè) Session對(duì)象。當(dāng)會(huì)話過(guò)期或被放棄后,服務(wù)器將終止該會(huì)話

核心特點(diǎn):

服務(wù)端存儲(chǔ) 會(huì)過(guò)期Session常用解決方案

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

負(fù)載均衡方式

借助負(fù)載均衡設(shè)備或者模塊,將指定的Session始終路由到同一臺(tái)機(jī)器即可,如Nginx。

副本復(fù)制方式

利用服務(wù)器節(jié)點(diǎn)間的副本復(fù)制方式,保證集群所有節(jié)點(diǎn)擁有的Session數(shù)據(jù)一致。

集中存儲(chǔ)方式

引入第三方存儲(chǔ),將Session數(shù)據(jù)集中存儲(chǔ)到外部存儲(chǔ)中,如Redis或者數(shù)據(jù)庫(kù)等。

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

Spring-Session

核心組成模塊

Spring Session Core

提供Spring Session核心的功能和API

Spring Session Data Redis

提供基于Redis的SessionRepository以及配置

Spring Session JDBC

提供基于關(guān)系型數(shù)據(jù)庫(kù)的SessionRepository以及配置

Spring Session Hazelcast

提供基于Hazelcast的SessionRepository以及配置

測(cè)試代碼

controller提供三個(gè)接口,分別對(duì)應(yīng)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對(duì)應(yīng)頁(yè)面操作

<!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的使用示例

基于數(shù)據(jù)庫(kù)的Spring-Session

1.引入maven依賴

使用MySQL存儲(chǔ),所以引入了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’)

如果存在這個(gè)報(bào)錯(cuò),是因?yàn)闆]有引入spring-boot-starter-jdbc,引入即可。

2.配置application.properties文件

主要包含兩部分,數(shù)據(jù)庫(kù)的配置以及Spring Session Jdbc配置。

# 配置數(shù)據(jù)源相關(guān)內(nèi)容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# 超時(shí)時(shí)間spring.session.timeout=180s

3.數(shù)據(jù)庫(kù)存儲(chǔ)解析

默認(rèn)情況下,數(shù)據(jù)庫(kù)中會(huì)創(chuàng)建2張表。SPRING_SESSION和SPRING_SESSION_ATTRIBUTION。

SPRING_SESSION用于存在session自身的一些屬性,如創(chuàng)建時(shí)間、過(guò)期時(shí)間等,詳細(xì)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用于存儲(chǔ)session相關(guān)聯(lián)的屬性,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.測(cè)試執(zhí)行

SPRING_SESSION中的數(shù)據(jù)

Spring Session的使用示例

SPRING_SESSION_ATTRIBUTION中的數(shù)據(jù)。

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

結(jié)果分析

一次請(qǐng)求后,多了三個(gè)屬性,分析如下。

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

在訪問(wèn)時(shí),先通過(guò)第一個(gè)key,判斷session是否存在以及是否過(guò)期。如果沒有過(guò)期,可以通過(guò)第二個(gè)key獲取或者更新對(duì)應(yīng)的session詳情。

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

訂閱Spring-Session的相關(guān)事件

有些時(shí)候,我們比較關(guān)心Session的創(chuàng)建或者銷毀事件,做一些特殊的處理或者記錄?;赗edis的Spring-Session利用Spring Event將該事件發(fā)布出來(lái),我們可以使用EventListener監(jiān)聽做處理。

@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); }}總結(jié)

Spring Session提供了非常便利的,基于關(guān)系型數(shù)據(jù)庫(kù)或者Redis的Session解決方案。

Redis版訪問(wèn)速度快,基于Redis的過(guò)期策略,保證過(guò)期數(shù)據(jù)會(huì)被刪除,同時(shí)支持事件訂閱。

數(shù)據(jù)庫(kù)版直接基于數(shù)據(jù)庫(kù),無(wú)需單獨(dú)引入其他存儲(chǔ)。但是訪問(wèn)速度相對(duì)較慢,過(guò)期數(shù)據(jù)需要依賴應(yīng)用程序自身進(jìn)行刪除。同時(shí)沒有提供事件訂閱能力。

以上就是Spring Session的使用示例的詳細(xì)內(nèi)容,更多關(guān)于Spring Session的使用的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 股指期货-期货开户-交易手续费佣金加1分-保证金低-期货公司排名靠前-万利信息开户 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 桁架楼承板-钢筋桁架楼承板-江苏众力达钢筋楼承板厂 | 万烁建筑设计院-建筑设计公司加盟,设计院加盟分公司,市政设计加盟 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 红酒招商加盟-葡萄酒加盟-进口红酒代理-青岛枞木酒业有限公司 | 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 小威小说网 - 新小威小说网 - 小威小说网小说搜索引擎 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | RV减速机-蜗轮蜗杆减速机-洗车机减速机-减速机厂家-艾思捷 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 合肥制氮机_合肥空压机厂家_安徽真空泵-凯圣精机 | 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | 艺术生文化课培训|艺术生文化课辅导冲刺-济南启迪学校 | 工业铝型材生产厂家_铝合金型材配件批发精加工定制厂商 - 上海岐易铝业 | POS机办理_个人pos机免费领取-银联pos机申请首页 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 烟台金蝶财务软件,烟台网站建设,烟台网络推广 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 橡胶接头_橡胶软接头_可曲挠橡胶接头-巩义市创伟机械制造有限公司 | 洗地机-全自动/手推式洗地机-扫地车厂家_扬子清洁设备 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 成都装修公司-成都装修设计公司推荐-成都朗煜装饰公司 | 代办建筑资质升级-建筑资质延期就找上海国信启航 | 阻垢剂-反渗透缓蚀阻垢剂厂家-山东鲁东环保科技有限公司 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 变色龙云 - 打包app_原生app_在线制作平台_短链接_ip查询 | 爆炸冲击传感器-无线遥测传感器-航天星百科 | 南京蜂窝纸箱_南京木托盘_南京纸托盘-南京博恒包装有限公司 |