系列文章目录
JavaSE | ||
---|---|---|
基础知识、数据类型学习 | 万年历项目 | 代码逻辑训练习题 |
代码逻辑训练习题 | 方法、数组学习 | 图书管理系统项目 |
面向对象编程:封装、继承、多态学习 | 封装继承多态习题 | 常用类、包装类、异常处理机制学习 |
集合学习 | IO流、多线程学习 | 仓库管理系统JavaSE项目 |
员工管理系统、多表查询、反射实现DBHelper学习 | DML、DDL、数据库对象学习 | |
JavaWeb | ||
网络编程、各种标签、CSS学习 | ECMAScript、BOM学习 | DOM、jQuery学习 |
Servlet、JSP、Cookie、Ajax学习 | 融资管理系统JavaWeb项目 | |
框架 | ||
MyBatis框架学习 | 逆向工程、Spring框架IOC、AOP学习 | SpringMVC框架学习 |
SpringBoot框架学习 | 招聘网站框架项目 | Vue介绍、窗体内操作、窗体间操作学习 |
Vue路由配置、网络请求访问框架项目、element组件介绍学习 | 标准管理系统Vue项目 | |
微服务 | ||
Linux安装、Nginx反向代理、负载均衡学习 | Docker学习 | Jenkins学习 |
Nexus学习 | Spring Security学习 | RabbitMQ学习 |
Redis学习 | MongoDB学习 | MongoDB学习 |
Nacos学习 | Spring Session学习 | Spring Gateway学习 |
JSR 303学习 | OpenFeign学习 | Hystrix学习 |
文章目录
- 系列文章目录
- 前言
- 一、Spring Session介绍
- 1. Spring Session介绍
- 2. Spring Session实现Session共享的方式
- 二、设置SpringSession
- 1. 启动redis,nacos
- 2. 创建Maven项目
- 3. 添加依赖
- 4. 编写SpringBootMain启动类
- 5. 编写UserController控制器类
- 6. 启动项目访问127.0.0.1:100/user
- 7. 创建第二个项目demo-session-02
- 8. 启动两个项目,实现效果
- 三、统一Session
- 1. 添加依赖
- 2. 修改application.yml配置文件
- 3. 编写application.properties配置文件
- 4. 添加Nacos-Redis配置
- 5. 编写bootstrap.yml配置文件
- 6. 更改SpringBootMain启动类
- 7. 编写SessionConfig配置类
- 8. 启动两个项目,实现效果
- 总结
前言
本文我们要讲述:
Spring Session
在下攸攸太上。
一、Spring Session介绍
1. Spring Session介绍
Spring Session是一个用于管理Session的框架,特别适用于微服务架构中的分布式场景。在微服务架构中,由于应用了分布式的思想,Session无法在各个微服务之间进行共享,需要一个框架来实现Session数据的共享。Spring Session解决了这个问题。
2. Spring Session实现Session共享的方式
修改Tomcat配置文件:通过修改Tomcat的配置文件,将Session存储在外部共享的存储介质中(如Redis),从而实现Session的共享。这种方式已经不推荐使用,因为存在一些限制。
Nginx负载均衡策略:通过Nginx的负载均衡配置,采用ip_hash的方式将同一个IP的请求路由到同一个服务实例中,从而保证Session的一致性。但这种方式无法充分利用硬件资源,并且在负载均衡配置上存在一些复杂性。
Redis统一存储:这是最推荐的方式,通过将Session数据存储在Redis中,实现Session的共享和管理。Spring Boot可以很方便地集成Spring Session,并通过Nacos进行配置管理,将Session数据存储在Redis中。这种方式既可以保证Session的共享和一致性,又能充分利用硬件资源。
二、设置SpringSession
1. 启动redis,nacos
docker start redis-6379
docker start nacos
2. 创建Maven项目
3. 添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.7.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
<jwt.version>0.7.0</jwt.version>
<fastjson.version>1.2.60</fastjson.version>
<spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
4. 编写SpringBootMain启动类
package com.jjy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootMain {
public static void main(String[] args) {
SpringApplication.run(SpringBootMain.class,args);
}
}
5. 编写UserController控制器类
package com.jjy.controller;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
@RequestMapping("/user")
@Setter
public class UserController {
@GetMapping
public String test(HttpSession session){
return session.getId();
}
}
6. 启动项目访问127.0.0.1:100/user
7. 创建第二个项目demo-session-02
更改pom文件中artifactId为:demo-session-02
修改application.yml中port为:200
8. 启动两个项目,实现效果
两个Session的ID不同
三、统一Session
以下两个文件都要同时操作,如果需要分别操作,会特别标识
1. 添加依赖
在dependencies标签下添加子标签
<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>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 修改application.yml配置文件
注意缩进
spring:
session:
store-type: redis
3. 编写application.properties配置文件
spring.application.name=sessiondemo
4. 添加Nacos-Redis配置
在配置管理的配置列表中选择nacos0926
其中nacos0926是昨天文章
Nacos学习内新建的命名空间,可以在命名空间下新建,填写名字、描述即可,ID会自动生成
填写ID(必须以.yaml结尾
)、描述(随意)、配置内容、配置格式选择YAML
所有设置好后,点击发布
5. 编写bootstrap.yml配置文件
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.108.186:8848
config:
server-addr: 192.168.108.186:8848 #
file-extension: yaml
namespace: 7e56a725-f51a-4603-b421-49add0ae9c4b # 命名空间ID,粘贴复制过来即可。
shared-configs:
- data-id: redissession1.yaml # 配置详情内:Data ID,粘贴复制过来即可。
group: DEFAULT_GROUP # 配置详情内:Group 粘贴复制过来即可。
inetutils:
preferred-networks: 192.168.56 # 服务管理内,public内点击详情,可以查看,需要项目启动后能查看,一般默认192.168.56
6. 更改SpringBootMain启动类
添加@EnableRedisHttpSession注解
7. 编写SessionConfig配置类
package com.jjy.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;
/**
* @author alen
* @date 2024/9/27 10:27:04
*/
@Configuration
public class SessionConfig {
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("JSESSIONID");
serializer.setCookiePath("/");
serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
return serializer;
}
@Bean
public RedisSerializer<Object> redisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}
8. 启动两个项目,实现效果
启动后查看服务列表,发现实例数有2
在两个项目页面中,session同步了,这样这两个项目就能共享session信息
总结
本文讲述了:
Spring Session:让两个项目共享会话,使生存域是会话的变量能够在项目间共享
在下攸攸太上,最近疯狂发文章,只是为了得到一周九篇才能拿到的劳模勋章,距离劳模勋章还差2篇。