一、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就是通过这样的思路实现的。

四、代码例子

  1. 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>
  1. config类
@Configuration
public class RedisConfig {// 将spring session中的序列化器替换成json的,默认的jdk序列化机制太费劲了@Beanpublic GenericJackson2JsonRedisSerializer springSessionDefaultRedisSerializer() {return new GenericJackson2JsonRedisSerializer();}
}
  1. entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {Long id;Integer age;String position;String userName;
}
  1. 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;}
}
  1. 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
  1. 首次访问 http://127.0.0.1:8888/user/login

    再次访问 http://127.0.0.1:8888/user/login


可以看到,redis中已经是以json的形式保存session了

Spring Session使用相关推荐

  1. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  2. 在SpringBoot中使用Spring Session解决分布式会话共享问题

    在SpringBoot中使用Spring Session解决分布式会话共享问题 问题描述: 每次当重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session ...

  3. session传递参数_分布式 Session 之 Spring Session 架构与设计

    作者 | 李增光 杏仁后端工程师.「只有变秃,才能变强!」 ​前言 开始进行 Web 开发时,我们可能会遇到这样的情况,当服务器重启之后,之前的登录状态会失效需要重新登录.又或者你的应用程序部署了不止 ...

  4. 在spring MVC项目中集成Spring session redis (使用spring session框架,redis作为存储缓存)...

    2019独角兽企业重金招聘Python工程师标准>>> 1.为项目增加以来  pom.xml中使用 <!-- spring session 单点登录 --> //本项目使 ...

  5. spring session 退出登录 清理session

    2019独角兽企业重金招聘Python工程师标准>>> spring session 退出登录 清理session 博客分类: spring /*** Allows creating ...

  6. Spring MVC集成Spring Data Reids和Spring Session实现Session共享

    说明:Spring MVC中集成Spring Data Redis和Spring Session时版本是一个坑点,比如最新版本的Spring Data Redis已经不包含Jedis了,需要自行引入. ...

  7. [译]Spring Session 与 Spring Security

    原文:http://docs.spring.io/spring-session/docs/current-SNAPSHOT/reference/html5/guides/security.html 本 ...

  8. 利用spring session解决共享Session问题

    https://blog.csdn.net/patrickyoung6625/article/details/45694157 1.共享Session问题 HttpSession是通过Servlet容 ...

  9. Spring Session - 源码解读

    文章目录 Spring Session 流程图 源码分析 Spring Session 流程图 Spring Session 主要是利用过滤器,偷梁换柱,实现session储存无感知的切换. 源码分析 ...

  10. Spring Session - 使用Spring Session从零到一构建分布式session

    文章目录 快速入门 Spring Session + Redis 官网指导 Demo pom 依赖 配置文件 配置类RedisHttpSessionConfiguration Redis中的sessi ...

最新文章

  1. SharePoint迁移和升级方案
  2. 【错误记录】FFmpeg 推流报错 ( FLV does not support sample rate 8000, choose from (44100, 22050, 11025) )
  3. 【Ubuntu】Windows硬盘安装Ubuntu14.04
  4. php的配置工具,星外php自动配置工具
  5. 【SpringBoot】服务器端主动推送SSE技术讲解
  6. 又发现一款牛逼的 API 敏捷开发工具
  7. git常用操作,切换分支,合并分支
  8. JDBC粗略学习( 阿巴阿巴阿巴阿巴)
  9. 实时音视频直播带货中影响用户体验的Bug根因
  10. 在 Windows 10 中查找 BitLocker 恢复密钥
  11. matplotlib画图使用微软雅黑字体
  12. 分区表丢失修复与系统启动修复
  13. 科幻-奇幻小说TOP100
  14. mysql用户定义的完整性_Mysql(数据库完整性)
  15. OJ常用术语解释。AC、WA、TLE、CE、RE、MLE、PE等状态术语的解释
  16. 降低电源纹波噪声的方法
  17. Python变量赋值方法
  18. acc 蓝牙_蓝牙耳机≠音质差,只是你没选对耳机
  19. Word自动生成目录页码靠右对齐
  20. 云台山春花将逝,热情的盛夏等待您

热门文章

  1. redis 集群目标、集群查看、配置方法及过程、哨兵配置启动
  2. Activity的launchMode和任务栈小结
  3. python之初体验(一)
  4. win7 一些快捷系统工具命令
  5. Linux中的SELinux与chcon以及Samba实现【转】
  6. 【Python】查找目标值在列表中的索引序号
  7. 【Leetcode】几种简单的排序算法
  8. 科大星云诗社动态20210826
  9. [云炬python3玩转机器学习笔记] 3-6Numpy数组和矩阵的合并和分割
  10. 谈慎独2017-12-19