SpringSession
官方文档:
3359 spring.io/projects/spring-session
一Spring Session简介
1. Spring Session概念:
Spring Session是Spring系列的子项目,Spring Session提供了用于管理用户会话信息的API和实现。
重点是用spring-session替换servlet容器实现的httpSession,并解决session管理问题。 会话信息存储在Redis中,可以轻松、快速、无缝地集成到APP应用程序中
2. Spring Session的特性:
使用Spring Session,可以轻松支持群集会话,而无需绑定到特定于APP应用程序容器的解决方案。 它还提供与以下内容的透明集成:
http会话-允许将http会话中立地替换为APP应用程序容器,即Tomcat。 也可以在标头中指定会话ID,以便与rest风格的API一起使用
web socket -提供在接收web socket消息时保持http会话处于活动状态的功能
可以将WebSession-springwebflux中的websession中立地替换为APP应用程序容器
3. Session会话共享方案
第一个是基于Tomcat的tomcat-redis-session-manager插件、基于Jetty的jetty-session-redis插件、memcached-session-manager插件它对项目是透明的,而不更改代码,但它过于依赖容器,这意味着如果容器被升级或更换,则需要重新配置
第二,使用Nginx负载平衡ip_hash策略,在每次用户访问时绑定到同一台特定的后台tomcat服务器,以确保session始终存在
第三,您可以自己编写Session会话管理工具类,所有需要使用会话的时候都可以从自己的工具类中获取。 工具类后端存储可以放入Redis中。 该方案具有很好的灵活性,但开发起来需要时间
四是使用框架的会话管理工具,本文使用的Spring session。 该方案独立于tomcat容器,无需更改代码,由Spring session框架提供,可以说是目前非常完善的session共享解决方案
4.spring-session分为以下核心模块:
essionrepositoryfilter :从http session切换到Spring Session,以及实现用于包装HttpServletRequest和HttpServletResponse的servlet规范的filter
httpserverletrequest/httpservletresponse/http session wrapper包装器:原始HttpServletRequest、http servlet response、Spring Session
会话: spring session模块
会话资料档案库:用于管理spring会话的模块
http会话策略:将http请求和HttpResponse映射到会话的策略
二.Spring Session示例
1.在idea中 新建两个 springboot 项目
springsession01和springsession02
2. 导入依赖
-父亲依赖的-
父代
artifactidspring-boot-starter-parent/artifact id
groupid org.spring framework.boot/groupid
版本2.3.1 .版本/版本
/parent
从属关系
从属关系
p> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 springboot&redis 整合场景 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 引入 springboot&springsession 整合场景 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
</dependencies>
3. 分别写两个项目(springsession01 和 springsession02)的主启动类
4.在springsession01 中 写 TestController
设置session
package com.crowd.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
public class TestController {
@RequestMapping("/test/spring/session/save")
public String testSession(HttpSession session){
session.setAttribute("name","hjj");
return "测试 session 共享";
}
}
5.在springsession02 中 获取session中的
@RestController
public class TestController {
@RequestMapping("/test/spring/session/retrieve")
public String testSession(HttpSession session){
String name = (String) session.getAttribute("name");
return name;
}
}
6. 配置 application.yml
springsession01中:
#redis 配置
spring:
redis:
host: 127.0.0.1
jedis:
pool:
max-idle: 100
session:
store-type: redis # springsession 配置 type= redis
springsession02中:
#redis 配置
spring:
redis:
host: 127.0.0.1
#redis连接池配置
jedis:
pool:
max-idle: 100
session:
store-type: redis # springsession 配置 type= redis
#
server:
port: 8383
7. 分别启动两个 项目 测试
http://localhost:8080/test/spring/session/save
http://localhost:8383/test/spring/session/retrieve
Windows+R 输入cmd
在redis 中查找有没有 name
注意:
如果是Redis在linux 上面的 ,首先要开启虚拟机,开启Redis服务
还要修改 application.yml 中的
redis:
host:
如果 启动 报错
Exception in thread “main“ redis.clients.jedis.exceptions.JedisDataException
原因分析:
1)机器之间网络无法联通
2)ip和端口号不正确
3)虚拟机中防火墙的原因(可能性较大)
4)redis.conf 中bind 127.0.0.1 未用#注释掉
参考解决方案:
1,关闭linux防火墙
Centos6
查看防火墙状态:
[root@centos6 ~]# service iptables status
iptables:未运行防火墙。
开启防火墙:
[root@centos6 ~]# service iptables start
关闭防火墙:
[root@centos6 ~]# service iptables stop
centos7
#查看防火墙状态:,注意firewall与-cmd之间无空格
firewall-cmd --state
#关闭防火墙
systemctl stop firewalld.service
#开启防火墙
systemctl start firewalld.service
#禁用防火墙
systemctl disable firewalld.service
2,注释 redis.conf 配置文件中的 # bind 127.0.0.1,并将protected-mode设为no
修改redis.conf
vim redis.conf
2. 修改
#bind 127.0.0.1
protected-mode no