1.session是什么

当用户在前端发起请求时,服务器会为当前用户建立一个session,服务器将sessionId回写给客户端,只要用户浏览器不关闭,再次请求服务器时,将sessionId传给服务器,

服务器会根据sessionId找到与之对应的session为其服务。

如果是分布式部署时,session存储在服务器端,下次用户请求过来,通过负载均衡,可能会分发到其他服务器节点;所以,需要解决session一致性的问题,

使用redis来实现分布式session,个人理解是将session存放到redis中,每次请求过来时,会从redis读取session信息

2.代码实现

①.maven需要引入的依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.session</groupId>
  7. <artifactId>spring-session</artifactId>
  8. </dependency>

②.配置文件指定redis的ip和端口

  1. spring.redis.host=172.18.66.45
  2. spring.redis.port=6379

③.httpSession配置

  1. package com.session.config;
  2.  
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
  6. import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
  7. //maxInactiveIntervalInSeconds设置session有效时间,单位是秒;默认是30分钟
  8. @EnableRedisHttpSession(maxInactiveIntervalInSeconds=180)
  9. public class SessionConfig {
  10.  
  11. @Value("${spring.redis.host}")
  12. private String hostName;
  13. @Value("${spring.redis.port}")
  14. private int port;
  15.  
  16. @Bean
  17. public JedisConnectionFactory connectionFactory() {
  18. JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
  19. connectionFactory.setPort(port);
  20. connectionFactory.setHostName(hostName);
  21. System.out.println("获取到的hostName是:"+hostName + ",port :"+port);
  22. return connectionFactory;
  23. }
  24. }

再实现一个controller,就可以模拟实际业务场景写session、根据session校验用户是否登录

  1. package com.session.controller;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpSession;
  5.  
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8.  
  9. @RestController
  10. public class SessionController {
  11.  
  12. //模拟第一次登陆时,保存session
  13. @RequestMapping(value="/login")
  14. public String login(HttpServletRequest request) {
  15. HttpSession session = request.getSession();
  16. String str = (String) session.getAttribute("userInfo");
  17. if(str == null || "".equals(str)) {
  18. session.setAttribute("userInfo", "mpy test session");
  19. return "用户登录成功-success";
  20. }else{
  21. return "session中存在数据,用户已登录";
  22. }
  23. }
  24.  
  25. /*该方法模式登陆之后,调用业务接口
    *在实际的业务场景中,可以使用拦截器,对每次请求进行判断,校验用户是否登录、session是否过期
    */
  26. @RequestMapping(value="/getSession")
  27. public String getSession(HttpServletRequest request) {
  28. HttpSession session = request.getSession();
  29. String str = (String) session.getAttribute("userInfo");
  30. if(str == null || "".equals(str)) {
  31. return "session中没有数据,请登录";
  32. }else{
  33. //已登录用户,进行其他业务代码的处理
  34. System.out.println("session中的属性是:"+str);
  35. return str;
  36. }
  37. }
  38.  
  39. @RequestMapping(value="/logout")
  40. public String logout(HttpServletRequest request) {
  41. HttpSession session = request.getSession();
  42. String str = (String) session.getAttribute("userInfo");
  43. if(str != null && "".equals(str)) {
  44. session.invalidate();
  45. }
  46. return "退出成功";
  47. }
  48. }

@EnableRedisHttpSession和spring-session的实现原理还有待研究学习

具体的代码,已经上传至GitHub,https://github.com/mapy95/spring-session.git

基于redis解决session分布式一致性问题的更多相关文章

  1. 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享

    因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...

  2. .Net分布式架构(二):基于Redis的Session共享

    一:Session简介 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台web服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台web服务器建立连 ...

  3. 基于redis的简易分布式爬虫框架

    代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...

  4. 基于redis实现的分布式锁

    基于redis实现的分布式锁 我们知道,在多线程环境中,锁是实现共享资源互斥访问的重要机制,以保证任何时刻只有一个线程在访问共享资源.锁的基本原理是:用一个状态值表示锁,对锁的占用和释放通过状态值来标 ...

  5. Tomcat7基于Redis的Session共享实战二

    目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无 ...

  6. 基于Redis的简单分布式锁的原理

    参考资料:https://redis.io/commands/setnx 加锁是为了解决多线程的资源共享问题.Java中,单机环境的锁可以用synchronized和Lock,其他语言也都应该有自己的 ...

  7. Tomcat7基于redis的session共享

    一,项目需求 因开发人员在登录后台时需要反复认证,tomcat反复切换,所以给运维组提出需求,解决session共享问题. 二,解决方法 环境:基于Centos6.8 Jdk 版本   java ve ...

  8. [转]Tomcat7基于Redis的Session共享

    转自:http://blog.csdn.net/catoop/article/details/48603891 目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均 ...

  9. Tomcat7基于Redis的Session共享实战一

    本文主要介绍如何使用redis对tomcat7的session进行托管. 1.安装Redisredis安装比较简单,此处略过. 2.配置两个Tomcat在本机上配置两个Tomcat,分别为tomcat ...

随机推荐

  1. Flume和Kafka完成实时数据的采集

    Flume和Kafka完成实时数据的采集 写在前面 Flume和Kafka在生产环境中,一般都是结合起来使用的.可以使用它们两者结合起来收集实时产生日志信息,这一点是很重要的.如果,你不了解flume ...

  2. Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)

    写在前面 记录一下,一个自动化开发部署项目的构建过程与简单使用,实现真正的DevOps gitlab安装 步骤一:安装依赖 yum -y install git gcc glibc-static te ...

  3. Spring 梳理-MVC-配置DispatcherServet和ContextLoaderListener

    在使用JavaConfig时,AbstractAnnotationConfigDispatcherServletInitializer会自动注册 DispatcherServlet 和 Context ...

  4. spring 定时器知识点

    一.各域说明 字段域 秒 分 时 日 月 星期(7为周六) 年(可选) 取值范围 0-59 0-59 0-23 1-31 1-12或JAN–DEC 1-7或SUN–SAT 1970–2099 可用字符 ...

  5. python——代理ip获取

    python爬虫要经历爬虫.爬虫被限制.爬虫反限制的过程.当然后续还要网页爬虫限制优化,爬虫再反限制的一系列道高一尺魔高一丈的过程. 爬虫的初级阶段,添加headers和ip代理可以解决很多问题. 贴 ...

  6. 面试题解析|ACL权限控制机制

    ACL(Access Control List)访问控制列表 包括三个方面: 一.权限模式(Scheme) 1.IP:从 IP 地址粒度进行权限控制 2.Digest:最常用,用类似于 usernam ...

  7. IDEA 学习笔记之 Maven项目开发

    Maven项目开发: 配置Maven: 新建Maven项目: 选择webapp: 和eclipse一样,设置: 修改maven配置,添加一个新属性,可以加快项目创建速度: 完成: 新建java和tes ...

  8. 31、vue-cli3引入封装svg图标

    svg图标放大不失真,png会出现失真现象. 一.方法一 1.在对应vue项目里添加插件 vue add svg-sprite 输入 Y 2.在执行 npm install svgo svgo-loa ...

  9. 部署主从dns

    主机部署:yum安装DNS服务和依赖 [admin@haifly-bj-dns1 ~]$ sudo yum install bind-chroot启动named-chroot服务 [admin@hai ...

  10. requests模块(代理)篇

    - 用户验证 - 代理验证 #可能需要使用HTTP basic Auth, 可以这样 # 格式为 用户名:密码@代理地址:端口地址 proxy = { "http": " ...