mvc中如何保持session,SpringBoot 2 整合 Spring Session 最簡操作

 2023-10-02 阅读 30 评论 0

摘要:SpringBoot 2 整合 SpringSession前言Spring Session 介紹SpringBoot 快速整合 Spring SessionSpring Session 測試負責獲取分布式 Session 的配置和代碼:負責創建分布式 Session 的配置和代碼:SpringBoot 整合 Spring Session 自定義配置介紹小結代碼示例 前言

SpringBoot 2 整合 SpringSession

    • 前言
    • Spring Session 介紹
    • SpringBoot 快速整合 Spring Session
    • Spring Session 測試
      • 負責獲取分布式 Session 的配置和代碼:
      • 負責創建分布式 Session 的配置和代碼:
    • SpringBoot 整合 Spring Session 自定義配置介紹
    • 小結
    • 代碼示例

前言

通過該篇博客,你將了解到如何快速通過 SpringBoot 2 + Spring Session 來實現分布式 Session 環境的搭建。

Spring Session 介紹

SpringBoot 整合 Spring Session 前,先了解一下什么是 Spring Sessin。

mvc中如何保持session。Spring 官方 (https://spring.io/projects/spring-session)關于 Spring Session 介紹如下:

Spring Session provides an API and implementations for managing a user’s session information.
Spring Session makes it trivial to support clustered sessions without being tied to an application container specific solution. It also provides transparent integration with:

  • HttpSession - allows replacing the HttpSession in an application container (i.e. Tomcat) neutral way, with support for providing
    session IDs in headers to work with RESTful APIs
  • WebSocket - provides the ability to keep the HttpSession alive when receiving WebSocket messages
  • WebSession - allows replacing the Spring WebFlux’s WebSession in an application container neutral way

中文翻譯如下 :

Spring Session提供了用于管理用戶會話信息的API和實現。
Spring Session使得支持集群會話變得微不足道,而不依賴于特定于應用程序容器的解決方案。它還提供透明集成:

  • HttpSession - 允許以應用程序容器(即Tomcat)中立的方式替換HttpSession,支持在頭文件中提供會話ID以使用RESTful API
  • WebSocket - 提供在接收WebSocket消息時保持HttpSession活動的能力
  • WebSession - 允許以應用程序容器中立方式替換Spring WebFlux的WebSession

從官方介紹中可以了解到 Spring Session 是用來解決,集群下實現全局 Session的一個框架實現。全局 Session 也可以理解成分布式Session。那什么是分布式Session呢?

分布式Session 就是我們的 Session 會話對于集群中的每個服務共享。我這里舉一個例子:

spring session原理?假如一個商品服務通過2臺機器 A和B 進行集群部署,用戶訪問 A服務器登錄成功后,將此用戶Session信息保存在 A 服務器上。突然A服務器突然宕機,用戶訪問跳轉B服務器上。此時B服務器上并沒有A服務的 Session。用戶需要再次執行登錄操作。而Spring Session 可以將用戶登錄后的Session 保存在Redis或者數據庫中,當 A 服務器宕機切換到 B 服務器時,此時B服務器從Redis中獲取Session,無需在進行登錄操作。

SpringBoot 快速整合 Spring Session

該篇博客介紹 Spring Session 通過 Redis 存儲Session的方式來實現。
在整合前你首先應該在本地或者遠程的機器上安裝 redis 服務,可以參考 Windows 安裝 Redis
教程。其他系統可以百度或者期待我后續的博客教程。

SpringBoot 和 Spring Session 整合的配置需要引入2個 start依賴:

  • spring-session-data-redis
  • spring-boot-starter-data-redis

具體代碼如下:

		<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>

如果你的 Redis服務是單機版默認配置,并且和你的 SpringBoot 應用在同臺機器上。SpringBoot 和 Spring Session 的整合就搞定了。是不是很簡單哈。

Java session。如果你的Redis服務在遠程的機器上,那么你需要在 application.properties 配置文件中配置一下 Redis的主機ip 和 端口號即可。
spring.redis.host=遠程 Redis 服務主機 IP
spring.redis.port=遠程 Redis

如果你的單機版Redis服務不是默認配置, 那么你需要像遠程Redis服務一樣進行配置其 主機ip 和端口號。

Spring Session 測試

創建 2個SpringBoot 應用實例, 通過設置不同的端口號進行區分。2個 SpringBoot 應用實例。一個負責創建Session、 一個負責獲取Session。

負責獲取分布式 Session 的配置和代碼:

application.properties 配置如下:

server.port=8090
server.servlet.context-path=/sbe
spring.redis.host=localhost

獲取Session 測試代碼如下:

@RestController
@RequestMapping("/session")
public class SpringSessionTestController {@RequestMapping("/get/{name}")public String getSesseion(HttpServletRequest request,@PathVariable("name") String name){HttpSession session = request.getSession();String value = (String)session.getAttribute(name);return "sessionId:"+session.getId()+" value:"+value;}
}

負責創建分布式 Session 的配置和代碼:

@SpringBootApplication?application.properties 配置如下:

server.port=8080
server.servlet.context-path=/sbe
spring.redis.host=localhost

創建Session測試代碼如下:

@RestController
@RequestMapping("/session")
public class SpringSessionTestController {@RequestMapping("/add/{name}/{value}")public String addSession(HttpServletRequest request,@PathVariable("name") String name,@PathVariable("value") String value){HttpSession session = request.getSession();session.setAttribute(name,value);return "sessionId:"+session.getId()+" name:"+name;}
}

測試結果如下圖所示:
在這里插入圖片描述
在這里插入圖片描述

SpringBoot 整合 Spring Session 自定義配置介紹

在快速整合的介紹中 我們使用都是默認的配置。如果你想自定義定義 Session 過期時間 、session的刷新模式 、存儲Session的命名空間。可以通過在 application.properties 中進行配置。

具體配置介紹如下:

  • springsession跨域。spring.session.store-type=redis

    設置 Spring Session 使用 Redis 進行存儲。默認配置就是 redis

  • spring.session.timeout=10m
    設置 Spring Session 的過期時間。如果不指定單位模式是 s。
    也可以通過在啟動類上聲明@EnableRedisHttpSession進行配置。
    例如:@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)

  • spring.session.redis.flush-mode=on_save

    session刷新模式,有2中

    1. on_save
      保存時刷新,即響應結束后刷新。默認是 on_save
    2. immediate
      實時刷新

    springboot獲取session。也可以通過在啟動類上聲明@EnableRedisHttpSession進行配置。
    例如:@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.ON_SAVE)

  • spring.session.redis.namespace=redis:session

    存儲 Session的命名空間,默認是spring:session。

    通過 Redis Desktop Manager 可以查看存儲到Redis中的session信息的key都是以
    spring:session打頭的。
    在這里插入圖片描述

命名空間主要是用于多個服務之間進行區分 。

spring session共享,也可以通過在啟動類上聲明@EnableRedisHttpSession進行配置。
例如:@EnableRedisHttpSession(redisNamespace=“xxxx”)

小結

通過在 SpirngBoot 項目中引入Spring Session 和 SpringBoot 整合 Redis 的 start 依賴,我們可以快速搭建分布式 Session 環境,同時也可以在 application.properties 中自定義 Session 的過期時間、命名空間、刷新模式的配置。

代碼示例

具體代碼示例請查看 :
博客的讀者可以通過查看下面倉庫的中的模塊工程名:spring-boot-2.x-spring-session-1 和spring-boot-2.x-spring-session-2

Github:
https://github.com/zhuoqianmingyue/springbootexamples/tree/master/spring-boot-2.x-spring-session-1 (獲取Session)
https://github.com/zhuoqianmingyue/springbootexamples/tree/master/spring-boot-2.x-spring-session-2 (創建Session)

如果您對這些感興趣,歡迎 star、或轉發給予支持!轉發請標明出處!

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/111075.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息