Spring Session使用
一、session的处理方式
参考本人这篇文章
二、spring session使用的session管理方式
就是Session集中管理的方式:
- 优点:可靠性高,减少Web服务器的资源开销。
- 缺点:实现上有些复杂,配置较多。
- 适用场景:Web服务器较多、要求高可用性的情况。
三、spring session的实现思路
- HttpSession的管理
HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。
但是把应用搭建成分布式的集群,然后利用F5、LVS或Nginx做负载均衡,那么来自同一用户的Http请求将有可能被分发到多个不同的服务器中
。那问题来了,如何保证不同的服务器能够共享同一份session数据呢?最简单的想法,就是把session数据保存到内存以外的一个统一的地方,例如Memcached/Redis等数据库中。那问题又来了,如何替换掉Servlet容器创建和管理的HttpSession的实现呢?
- 方案一:利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。这方面其实早就有开源项目了,例如
memcached-session-manager(可以参考负载均衡+session共享(memcached-session-manager实现),以及tomcat-redis-session-manager
。不过这种方式有个缺点,就是需要耦合Tomcat/Jetty等Servlet容器的代码。- 方案二:
设计一个Filter,利用HttpServletRequestWrapper,实现自己的getSession()方法,接管创建和管理Session数据的工作
。spring-session就是通过这样的思路实现的。
四、代码例子
- pom.xml
<dependencies><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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency></dependencies>
- config类
@Configuration
public class RedisConfig {// 将spring session中的序列化器替换成json的,默认的jdk序列化机制太费劲了@Beanpublic GenericJackson2JsonRedisSerializer springSessionDefaultRedisSerializer() {return new GenericJackson2JsonRedisSerializer();}
}
- entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {Long id;Integer age;String position;String userName;
}
- controller
@RestController
public class UserController {private static final Logger logger = LoggerFactory.getLogger(UserController.class);/*** 把用户放入session* @param request* @return*/@RequestMapping("/user/login")@ResponseBodypublic Map<String, Object> login(HttpServletRequest request) {// 取出session中的userNameObject loginUser = request.getSession().getAttribute("loginUser");if (loginUser == null) {logger.info("不存在session,设置user");User u = new User();u.setAge(23);u.setId(1L);u.setPosition("总裁");u.setUserName("cristiano ronaldo");request.getSession().setAttribute("loginUser", u);} else {logger.info("存在session,user=" + JSON.toJSONString(loginUser));}Cookie[] cookies = request.getCookies();if (cookies != null && cookies.length > 0) {for (Cookie cookie : cookies) {logger.info(cookie.getName() + " : " + cookie.getValue());}}Map<String, Object> resp = new HashMap<String, Object>();resp.put("code", "000000");resp.put("msg", "交易成功");return resp;}/*** 获取session的用户* @param request* @return*/@RequestMapping("/user/getUser")@ResponseBodypublic Map<String, Object> getUser(HttpServletRequest request) {Map<String, Object> resp = new HashMap<>();resp.put("code", "000000");resp.put("msg", "交易成功");resp.put("body", request.getSession().getAttribute("loginUser"));Cookie[] cookies = request.getCookies();if (cookies != null && cookies.length > 0) {for (Cookie cookie : cookies) {logger.info(cookie.getName() + " : " + cookie.getValue());}}return resp;}
}
- application.yml
server:port: 8888
spring:session:store-type: redisapplication:name: s-sessionredis:host: xxpassword: xxport: 6379timeout: 10000 # 连接超时时间(毫秒)database: 3 # Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0lettuce:pool:max-active: 8 # 连接池最大连接数(使用负值表示没有限制) 默认 8max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1max-idle: 8 # 连接池中的最大空闲连接 默认 8min-idle: 0 # 连接池中的最小空闲连接 默认 0
- 首次访问 http://127.0.0.1:8888/user/login
再次访问 http://127.0.0.1:8888/user/login
可以看到,redis中已经是以json的形式保存session了
Spring Session使用相关推荐
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
- 在SpringBoot中使用Spring Session解决分布式会话共享问题
在SpringBoot中使用Spring Session解决分布式会话共享问题 问题描述: 每次当重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session ...
- session传递参数_分布式 Session 之 Spring Session 架构与设计
作者 | 李增光 杏仁后端工程师.「只有变秃,才能变强!」 前言 开始进行 Web 开发时,我们可能会遇到这样的情况,当服务器重启之后,之前的登录状态会失效需要重新登录.又或者你的应用程序部署了不止 ...
- 在spring MVC项目中集成Spring session redis (使用spring session框架,redis作为存储缓存)...
2019独角兽企业重金招聘Python工程师标准>>> 1.为项目增加以来 pom.xml中使用 <!-- spring session 单点登录 --> //本项目使 ...
- spring session 退出登录 清理session
2019独角兽企业重金招聘Python工程师标准>>> spring session 退出登录 清理session 博客分类: spring /*** Allows creating ...
- Spring MVC集成Spring Data Reids和Spring Session实现Session共享
说明:Spring MVC中集成Spring Data Redis和Spring Session时版本是一个坑点,比如最新版本的Spring Data Redis已经不包含Jedis了,需要自行引入. ...
- [译]Spring Session 与 Spring Security
原文:http://docs.spring.io/spring-session/docs/current-SNAPSHOT/reference/html5/guides/security.html 本 ...
- 利用spring session解决共享Session问题
https://blog.csdn.net/patrickyoung6625/article/details/45694157 1.共享Session问题 HttpSession是通过Servlet容 ...
- Spring Session - 源码解读
文章目录 Spring Session 流程图 源码分析 Spring Session 流程图 Spring Session 主要是利用过滤器,偷梁换柱,实现session储存无感知的切换. 源码分析 ...
- Spring Session - 使用Spring Session从零到一构建分布式session
文章目录 快速入门 Spring Session + Redis 官网指导 Demo pom 依赖 配置文件 配置类RedisHttpSessionConfiguration Redis中的sessi ...
最新文章
- SharePoint迁移和升级方案
- 【错误记录】FFmpeg 推流报错 ( FLV does not support sample rate 8000, choose from (44100, 22050, 11025) )
- 【Ubuntu】Windows硬盘安装Ubuntu14.04
- php的配置工具,星外php自动配置工具
- 【SpringBoot】服务器端主动推送SSE技术讲解
- 又发现一款牛逼的 API 敏捷开发工具
- git常用操作,切换分支,合并分支
- JDBC粗略学习( 阿巴阿巴阿巴阿巴)
- 实时音视频直播带货中影响用户体验的Bug根因
- 在 Windows 10 中查找 BitLocker 恢复密钥
- matplotlib画图使用微软雅黑字体
- 分区表丢失修复与系统启动修复
- 科幻-奇幻小说TOP100
- mysql用户定义的完整性_Mysql(数据库完整性)
- OJ常用术语解释。AC、WA、TLE、CE、RE、MLE、PE等状态术语的解释
- 降低电源纹波噪声的方法
- Python变量赋值方法
- acc 蓝牙_蓝牙耳机≠音质差,只是你没选对耳机
- Word自动生成目录页码靠右对齐
- 云台山春花将逝,热情的盛夏等待您