当我们访问 http://localhost:8858/session/get这样一个本地接口时,会通过该地址访问到tooncat服务器,然后服务器会判断发送请求的客户端是否建立过session会话,如果没有则重新建立一个session会话,如果有则继续使用该session会话。如何理解呢?就好比你在电话亭使用一块钱打电话,限时10分钟,然后我们通过电话号码(对应我们的接口访问地址)找到对方,当对方接听时开始有效计时,自此两者就建立一条通话连接(对应web服务器中的session会话)我们在有效期内可以随时进行信息交流。
开始使用,引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--实现Redis的自动化配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!--排除lettuce连接池,lettuce会经常出现莫名错误,稳定性也不如jedis-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入 Jedis 的依赖,这样 Spring Boot可以实现对 Jedis 的自动化配置 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!--实现Spring Session对Redis的自动化配置-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
添加相关配置
# 应用名称
spring:
application:
name: spring-session-redis
# 对应 RedisProperties 类
redis:
host: localhost
port: 6379
password: 479368 # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码!
database: 0 # Redis 数据库号,默认为 0
timeout: 15000 # Redis 连接超时时间,单位:毫秒。
# 对应 RedisProperties.Jedis 内部类
jedis:
pool:
max-active: 8 # 连接池最大连接数,默认为 8 。使用负数表示没有限制 同一时间最大只能执行8条sql语句,每执行一条语句就会和数据库建立一个连接
max-idle: 8 # 默认连接数最大空闲的连接数,默认为 8 。使用负数表示没有限制。
min-idle: 0 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。
max-wait: -1 # 连接池最大阻塞等待时间,单位:毫秒。默认为 -1 ,表示不限制。 执行语句到数据库响应数据的时间
server:
port: 8858
配置redis序列化,java默认使用jdk自带的序列化配置,可读性很差,我们进行替换
@Configuration
@EnableRedisHttpSession //自动化配置Spring Session使用Redis作为数据源
public class SessionConfig {
//默认情况下,Java采用自带的序列化方式 ,可读性很差,所以进行替换。
@Bean
public StringRedisSerializer stringRedisSerializer(){
return StringRedisSerializer.UTF_8;
}
}
新建一个SessionController接口测试类
@RestController
@RequestMapping("/session")
public class SessionController {
//HttpSession相当于会话通道,进行信息交流
@GetMapping("/set")
public void set(HttpSession session,
@RequestParam("key") String key,
@RequestParam("value") Object value){
session.setAttribute(key,value);
}
@GetMapping("/get")
public Map<String,Object> getAll(HttpSession session){
Map<String, Object> map = new HashMap<>();
Enumeration<String> enumeration = session.getAttributeNames();
while(enumeration.hasMoreElements()){
String key = enumeration.nextElement();
Object value = session.getAttribute(key);
map.put(key,value);
}
return map;
}
}
最后启动应用,先查询redis确定访问前情况,可以看到什么都没有
访问lhttp://localhost:8858/session/get,再查看redis,可以看到多了一条数据,这就是session
最后安利我使用的redis客户端连接软件----QuickRedis这是一款免费开源好用的redis连接工具
下载地址:QuickRedis下载地址