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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Session - 使用Spring Session从零到一构建分布式session

發(fā)布時間:2025/3/21 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Session - 使用Spring Session从零到一构建分布式session 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 快速入門 Spring Session + Redis
    • 官網(wǎng)指導(dǎo)
    • Demo
    • pom 依賴
    • 配置文件
    • 配置類RedisHttpSessionConfiguration
    • Redis中的session數(shù)據(jù)解析
  • 附 其他相關(guān)類
    • BaseController
    • 統(tǒng)一返回結(jié)果相關(guān)的Code
  • Jedis的POM依賴及配置


快速入門 Spring Session + Redis

官網(wǎng)指導(dǎo)

https://spring.io/projects/spring-session-data-redis#samples

我們就用spring boot 來演示下吧

Demo

pom 依賴

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>boot2</artifactId><groupId>com.artisan</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>springsession</artifactId><dependencies><!-- 實現(xiàn)對 Spring MVC 的自動化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- redis lettuce 需要使用--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!-- 實現(xiàn)對 Spring Session 使用 Redis 作為數(shù)據(jù)源的自動化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 實現(xiàn)對 Spring Data Redis 的自動化配置 --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

配置文件

server:port: 8888spring:redis:host: 127.0.0.1port: 6379password: # Redis密碼timeout: 5000mslettuce:pool:max-active: 8max-wait: -1msmax-idle: 8min-idle: 0session:store-type: redis
  • max-active: 8 # 連接池最大連接數(shù),默認(rèn)為 8 。使用負(fù)數(shù)表示沒有限制。

  • max-idle: 8 # 默認(rèn)連接數(shù)最大空閑的連接數(shù),默認(rèn)為 8 。使用負(fù)數(shù)表示沒有限制。

  • min-idle: 0 # 默認(rèn)連接池最小空閑的連接數(shù),默認(rèn)為 0 。允許設(shè)置 0 和 正數(shù)。

  • max-wait: -1 # 連接池最大阻塞等待時間,單位:毫秒。默認(rèn)為 -1 ,表示不限制。

  • session: store-type: redis 指定存儲類型


配置類RedisHttpSessionConfiguration

package com.artisan.config;import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/2/16 14:12* @mark: show me the code , change the world*/ @Configuration @EnableRedisHttpSession public class RedisHttpSessionConfiguration {@Bean(name = "springSessionDefaultRedisSerializer")public RedisSerializer springSessionDefaultRedisSerializer() {return RedisSerializer.json();} }

添加 @EnableRedisHttpSession 注解,開啟自動化配置 Spring Session 使用 Redis 作為數(shù)據(jù) 。

我們來下 EnableRedisHttpSession 注解

  • maxInactiveIntervalInSeconds 屬性,Session 不活躍后的過期時間,默認(rèn)為 1800 秒。

  • redisNamespace 屬性,在 Redis 的 key 的統(tǒng)一前綴,默認(rèn)為 “spring:session” 。

  • flushMode 屬性,Redis 會話刷新模式(RedisFlushMode)。支持兩種,默認(rèn)為RedisFlushMode.ON_SAVE

    RedisFlushMode.ON_SAVE ,在請求執(zhí)行完成時,統(tǒng)一寫入 Redis 存儲。
    RedisFlushMode.IMMEDIATE ,在每次修改 Session 時,立即寫入 Redis 存儲。

  • cleanupCron 屬性,清理 Redis Session 會話過期的任務(wù)執(zhí)行 CRON 表達(dá)式,默認(rèn)為 "0 * * * * *" 每分鐘執(zhí)行一次。雖然Redis 自帶了 key 的過期,但是惰性刪除策略,實際過期的 Session 還在 Redis 中占用內(nèi)存。所以,Spring Session 通過定時任務(wù),刪除 Redis 中過期的 Session ,盡快釋放 Redis 的內(nèi)存。

默認(rèn)情況下,采用 Java 自帶的序列化方式 ,可讀性很差。 所以在 springSessionDefaultRedisSerializer() 方法,定義了一個 Bean 名字為 springSessionDefaultRedisSerializer的 RedisSerializer Bean ,采用 JSON 序列化方式 。


好了,截止到目前,核心的框架已經(jīng)搭建起來了,我們來測試下

package com.artisan.controller;import com.artisan.common.CommonResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/2/16 14:42* @mark: show me the code , change the world*/ @RestController public class ArtisanController extends BaseController {@GetMapping("/mockSet")public CommonResult set(@RequestParam("key") String key, @RequestParam("value") String value) {getHttpSession().setAttribute(key, value);return CommonResult.success("成功模擬登錄");}@GetMapping("/mockGet") public CommonResult get(@RequestParam("key") String key) {return CommonResult.success( getHttpSession().getAttribute(key));}}

啟動測試類,走一波

package com.artisan;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class SpringSeesionDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringSeesionDemoApplication.class, args);}}

訪問 http://localhost:8888/mockSet?key=artisan &value=avalue

http://localhost:8888/mockGet?key=artisan


Redis中的session數(shù)據(jù)解析

127.0.0.1:0>keys *1) "spring:session:sessions:expires:e0dd90b9-9551-4e8a-9609-cde0758b88c2"2) "spring:session:sessions:e0dd90b9-9551-4e8a-9609-cde0758b88c2"3) "spring:session:expirations:1613470560000"

每一個 Session 對應(yīng) Redis 二個 key-value 鍵值對

  • 開頭:以 spring:session 開頭,可以通過 @EnableRedisHttpSession 注解的 redisNamespace 屬性配置。
  • 結(jié)尾:以對應(yīng) Session 的 sessionid 結(jié)尾。
  • 中間:中間分別是 "session"、"expirations"、sessions:expires

一般情況下,只需要關(guān)注中間為 session 的 key-value 鍵值對即可,它負(fù)責(zé)真正存儲 Session 數(shù)據(jù)

127.0.0.1:0>hgetall spring:session:sessions:ab7d40d8-cd3d-49d7-8b3a-d1ae71d409351) "lastAccessedTime" # 最后訪問時間2) "1613469344975"3) "maxInactiveInterval" # Session 允許最大不活躍時長,單位:秒。4) "1800"5) "creationTime" # 創(chuàng)建時間6) "1613469342207"7) "sessionAttr:artisan" # 設(shè)置的屬性值8) ""avalue"" 127.0.0.1:0>

對于中間為 sessions:expires和 expirations的兩個來說,主要為了實現(xiàn)主動刪除 Redis 過期的 Session 會話,解決 Redis 惰性刪除的問題。

spring:session:expirations:{時間戳},是為了獲得每分鐘需要過期的 sessionid 集合,即 {時間戳} 是每分鐘的時間戳


附 其他相關(guān)類

BaseController

package com.artisan.controller;import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;public class BaseController {public HttpServletRequest getRequest(){return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();}public HttpServletResponse getResponse(){return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();}public HttpSession getHttpSession(){return getRequest().getSession();}}

統(tǒng)一返回結(jié)果相關(guān)的Code

【IErrorCode 】

package com.artisan.common;public interface IErrorCode {long getCode();String getMessage(); }

【ResultCode 】

package com.artisan.common;public enum ResultCode implements IErrorCode {SUCCESS(200, "操作成功"),FAILED(500, "操作失敗"),VALIDATE_FAILED(404, "參數(shù)檢驗失敗"),UNAUTHORIZED(401, "暫未登錄或token已經(jīng)過期"),FORBIDDEN(403, "沒有相關(guān)權(quán)限");private long code;private String message;private ResultCode(long code, String message) {this.code = code;this.message = message;}public long getCode() {return code;}public String getMessage() {return message;} }

【CommonResult】

package com.artisan.common;public class CommonResult<T> {private long code;private String message;private T data;protected CommonResult() {}protected CommonResult(long code, String message, T data) {this.code = code;this.message = message;this.data = data;}/*** 成功返回結(jié)果** @param data 獲取的數(shù)據(jù)*/public static <T> CommonResult<T> success(T data) {return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);}/*** 成功返回結(jié)果** @param data 獲取的數(shù)據(jù)* @param message 提示信息*/public static <T> CommonResult<T> success(T data, String message) {return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);}/*** 失敗返回結(jié)果* @param errorCode 錯誤碼*/public static <T> CommonResult<T> failed(IErrorCode errorCode) {return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);}/*** 失敗返回結(jié)果* @param message 提示信息*/public static <T> CommonResult<T> failed(String message) {return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);}/*** 失敗返回結(jié)果*/public static <T> CommonResult<T> failed() {return failed(ResultCode.FAILED);}/*** 參數(shù)驗證失敗返回結(jié)果*/public static <T> CommonResult<T> validateFailed() {return failed(ResultCode.VALIDATE_FAILED);}/*** 參數(shù)驗證失敗返回結(jié)果* @param message 提示信息*/public static <T> CommonResult<T> validateFailed(String message) {return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);}/*** 未登錄返回結(jié)果*/public static <T> CommonResult<T> unauthorized(T data) {return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);}/*** 未授權(quán)返回結(jié)果*/public static <T> CommonResult<T> forbidden(T data) {return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);}/*** 請求異常返回結(jié)果#add by yangguo*/public static <T> CommonResult<T> badResponse(IErrorCode errorCode) {return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);}public long getCode() {return code;}public void setCode(long code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;} }

Jedis的POM依賴及配置

Spring Boot 2 以上默認(rèn)使用lettuce作為redis的客戶端,如果想要用jedis ,我這里也給大家準(zhǔn)備了一份,請參考

<dependencies><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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><!-- 去掉對 Lettuce 的依賴, Spring Boot 優(yōu)先使用 Lettuce 作為 Redis 客戶端 --><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><!-- 引入 Jedis 的依賴 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency></dependencies> spring:# 對應(yīng) RedisProperties 類redis:host: 127.0.0.1port: 6379password: # Redis 服務(wù)器密碼,默認(rèn)為空。生產(chǎn)中,一定要設(shè)置 Redis 密碼!database: 0 # Redis 數(shù)據(jù)庫號,默認(rèn)為 0 。timeout: 0 # Redis 連接超時時間,單位:毫秒。# 對應(yīng) RedisProperties.Jedis 內(nèi)部類jedis:pool:max-active: 8 # 連接池最大連接數(shù),默認(rèn)為 8 。使用負(fù)數(shù)表示沒有限制。max-idle: 8 # 默認(rèn)連接數(shù)最大空閑的連接數(shù),默認(rèn)為 8 。使用負(fù)數(shù)表示沒有限制。min-idle: 0 # 默認(rèn)連接池最小空閑的連接數(shù),默認(rèn)為 0 。允許設(shè)置 0 和 正數(shù)。max-wait: -1 # 連接池最大阻塞等待時間,單位:毫秒。默認(rèn)為 -1 ,表示不限制。

總結(jié)

以上是生活随笔為你收集整理的Spring Session - 使用Spring Session从零到一构建分布式session的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲国产视频一区 | 亚洲精品在线视频免费观看 | jjzz日本视频 | 韩国精品视频在线观看 | 91私拍| 伊人精品在线视频 | 欧美三级在线看 | 欧美精品亚洲精品 | 免费人成在线观看 | 福利二区视频 | 亚洲第一成年人网站 | 四虎国产视频 | 日本免费高清 | 白嫩少妇激情无码 | 欧美视频一区二区三区四区在线观看 | 色图自拍偷拍 | 日韩精品成人在线观看 | 国产精品色哟哟 | 亚洲欧美一区二区三区久久 | 超碰在线日韩 | 天天操天天操天天干 | 亚洲熟女一区二区三区 | 国产在线123 | 蜜芽一区二区 | 天天干天天谢 | 色七七久久 | 亚洲综合精品一区 | 国产真人真事毛片 | 激情小说av| 密臀久久| 黄色尤物视频 | 亚洲视频大全 | 国产成人精品视频在线观看 | 中文字幕av专区 | 免费簧片在线观看 | 极品国产在线 | 一级特黄毛片 | 亚洲国产aⅴ成人精品无吗 日韩乱论 | 四虎精品 | bangbros性欧美18| 黑人巨大精品欧美黑寡妇 | 日本中文字幕一区二区 | 91福利社在线观看 | 国产精品成人久久久 | 日韩色图片 | 国产人久久人人人人爽 | 黄页网站视频在线观看 | 麻豆激情网 | 国产精品成人电影在线观看 | 亚洲一区二区三区欧美 | 一区二区三区高清在线观看 | 95精品视频 | 熟妇人妻系列aⅴ无码专区友真希 | 亚洲一区二区不卡在线观看 | 91网视频 | 日本一区二区免费电影 | 欧美亚洲二区 | 91免费视频国产 | 91精品久久久久久综合五月天 | 中文字幕免费高清 | 妖精视频一区二区三区 | 五月少妇 | 国外av网站| 国产成人无码精品久久久久 | 视频一区国产精品 | 风间由美一区二区 | 久久精品视频日本 | 高清国产在线 | 高清欧美性猛交 | caoprom超碰 | 奴性女会所调教 | av二区在线| 国产日韩欧美在线 | 亚洲天堂网视频 | 99草在线视频 | av直接看| 天天搞天天干 | 98视频在线 | 粉嫩av一区二区三区天美传媒 | 噼里啪啦免费看 | 日韩视频在线观看一区 | 亚洲二区一区 | 成年人毛片| 青青草免费看 | 欧美久草视频 | 香蕉网在线观看 | 91青青草 | 国产乱淫av片免费看 | 天堂中文网 | 美脚の诱脚舐め脚视频播放 | www.亚洲色图.com | 亚洲一区二区黄 | 视频在线不卡 | 超碰97免费在线 | 亚洲啊啊 | 91国内视频 | 国产精品图片 | 欧美性猛交久久久乱大交小说 | 69精品久久久久久 |