網站首頁 編程語言 正文
Cookie 保存在客戶端瀏覽器中,而 Session 保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,這就是 Session。客戶端瀏覽器再次訪問時只需要從該 Session 中查找該客戶的狀態就可以了。
在實際工作中我們建議使用外部的緩存設備來共享 Session,避免單個服務器節點掛掉而影響服務,共享數據都會放到外部緩存容器中。
Spring 官方針對 Session 管理這個問題,提供了專門的組件 Spring Session,使用 Spring Session 在項目中集成分布式 Session 非常方便。Spring 為 Spring Session 和 Redis 的集成提供了組件:spring-session-data-redis
使用 Redis 實現共享 Session 原理:
所有服務器的Session信息都存儲到了同一個Redis集群中,即所有的服務都將 Session 的信息存儲到 Redis 集群中,無論是對 Session 的注銷、更新都會同步到集群中,達到了 Session 共享的目的。
1.導入依賴
<!-- Redis 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- Spring Session Redis 依賴-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2.配置application.yml文件
server:
port: 8080
spring:
session:
store-type: redis
redis:
host: 127.0.0.1
port: 6379
password:
database: 0
3.配置Session
方法一:在啟動類上加上?@EnableRedisHttpSession?
注解
@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class RedisSessionStudyApplication {
public static void main(String[] args) {
SpringApplication.run(RedisSessionStudyApplication.class, args);
}
}
方法二:單獨編寫一個配置類并加上?@EnableRedisHttpSession?
注解
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class SessionConfig {
}
maxInactiveIntervalInSeconds
: 設置 Session 失效時間
使用 Redis Session 之后,原 Spring Boot 中的 server.session.timeout
屬性不再生效。
4.編寫測試用戶類
一定要實現序列化接口,因為 Session 將數據存放到了 Redis 集群中,所以存入的數據也需要能夠被序列化。
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private Long id;
private String username;
private String password;
public static final User defaultUser() {
return builder().id(1L).username("MrVK").password("2333").build();
}
}
5.編寫控制器類
@RequestMapping("/index")
public String index(HttpServletRequest request) {
User user = (User) request.getSession().getAttribute("user");
if (user != null) {
return "index message";
}
return "please login first";
}
@RequestMapping("/login")
public String login(HttpServletRequest request, String username, String password) {
User userFromDB = defaultUser();
if (username.equals(userFromDB.getUsername())) {
if (password.equals(userFromDB.getPassword())) {
request.getSession().setAttribute("user", userFromDB);
return "login success";
}
}
return "login failure";
}
@RequestMapping("/logout")
public String login(HttpServletRequest request) {
request.getSession().removeAttribute("user");
return "has already logout";
}
6.測試
8080端口的服務器與9090端口的服務器連接的是同一個Redis服務器,所以8080端口的服務器與9090端口的服務器共享的是同一個 Session,在8080端口服務器登錄后,在9090端口服務器是可以訪問受限制資源的。
同樣,在9090端口上進行用戶退出,然后再測試8080端口是否可以訪問受限制資源,結果是用戶退出后不可以訪問受限制資源。
原文鏈接:https://blog.csdn.net/Mr_VK/article/details/136363446
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-07-02 Python使用struct庫的用法小結_python
- 2024-02-29 UNI-APP獲取當前位置,出現getLocation:fail [geolocation:7]錯誤
- 2022-09-26 符合選擇器和css三大特性組合
- 2022-10-17 Kotlin編程基礎語法編碼規范_Golang
- 2022-05-24 C#創建及訪問網絡硬盤的實現_C#教程
- 2022-10-24 六個Python3中使用最廣泛的內置函數總結_python
- 2023-05-24 Python?的第三方調試庫????pysnooper???使用示例_python
- 2022-04-19 idea如何解決jar包沖突
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支