首页 > 其他分享 >Session共享实现

Session共享实现

时间:2022-10-16 14:13:03浏览次数:73  
标签:session 缓存 实现 Redis redis 用户 Session request 共享

Session 共享实现

为什么要实现session共享呢

  • 随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题:

  • 当用户进行一个session会话的时候,比如一个用户去登录项目,一般的大公司的项目都是有Nginx进行反向代理的,但是这里简单列举一下Nginx常用的几种反向代理策略:1.轮询策略,2. 权重比例策略,3. ip_hash策略,4.fair策略,5. 还可以自定义的策略,在Nginx的反向代理下,一般会把用户的请求分发到不同的服务器上,但是如果用户请求的请求是存放在该请求的服务器A上,那么该用户的sessionID就存储在该服务器上JVM的一个ConcurrentHashmap中,以sessionID为key。

  • 但是如果此时用户请求的一个服务模块可能需要调用到服务器B,当用户发起请求的时候,此时的服务器B上并没有存储该用户的sessionID,所以就会再次让用户进行一个登陆操作。还有可能会导致用户本来就想完成一个下单操作,但是却还登陆了好几次的情况。

  • 所以session共享方案在分布式环境和微服务系统下,显得尤其重要。

 

实现session共享的几种方式:

  1. 基于Nginx的ip_hash 负载均衡

  2. 基于Tomcat的session复制

  3. session放到cookie中去

  4. 使用Redis做缓存session的统一缓存

 

使用Redis做缓存session的统一缓存

本次主要实现的是第四种方式的实现(使用Redis做缓存session的统一缓存)

  1. 步骤: 在项目中导入Redis和Session-Redis依赖

    <!--SpringBoot整合redis依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <version>2.6.4</version>
    </dependency>
    ​
    <!--Redis整合session依赖,引入后会自动将 session 存储到 redis 中-->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
        <version>2.6.3</version>
    </dependency>

     

    注意:引入redis和spring-redis依赖版本需要接近

     

  2. 在application.xml里配置Redis和session

    spring:
      #session
      session:
        #session失效时间
        timeout: 86400
        #默认是none,表示存储在单台服务器
        store-type: redis   #表示从redis中读写session(关键)
      #redis
      redis:
        port: 6379
        host: xxx.xxx.xxx.xxx
        password: xxxxxx
        database: 0

    关键:store-type: redis,只要配置了这个,那么代码中session就会存放到redis中而不是自己的内存中

 

测试

后端session存入redis

    @Override
    public User userLogin(String userAccount, String userPassword, HttpServletRequest request) {
        //1.校验
        //账号不能包含特殊字符
        
        //2.加密
        //查询账户是否存在
        
        //用户不存在
        //3.用户信息脱敏
​
        //4.记录用户的登录态
        request.getSession().setAttribute(USER_LOGIN_STATE,safetyUser);
        return safetyUser;
    }

 

向后端发送登录请求

 

 

验证redis中session是否存在

 

 

验证成功

 

转载至

https://blog.csdn.net/qq_43842093/article/details/120836732?ops_request_misc=&request_id=&biz_id=102&utm_term=Session%E5%85%B1%E4%BA%AB%E5%AE%9E%E7%8E%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-120836732.142^v56^js_top,201^v3^control_1&spm=1018.2226.3001.4187

https://blog.csdn.net/YXXXYX/article/details/125342292?ops_request_misc=&request_id=&biz_id=102&utm_term=Session%E5%85%B1%E4%BA%AB%E5%AE%9E%E7%8E%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-125342292.142^v56^js_top,201^v3^control_1&spm=1018.2226.3001.4187

标签:session,缓存,实现,Redis,redis,用户,Session,request,共享
From: https://www.cnblogs.com/galo/p/16796115.html

相关文章

  • js实现列表自动滚动循环播放
    1.实现效果图鼠标移入,暂停滚动;鼠标移出,继续滚动;2.原理要实现无缝衔接,在原有ul后面还要有一个一样内容的ul;最外层div为可视区域,设overflow:hidden;2个ul的高度>外层......
  • stat命令的实现-mysate
    stat命令的实现-mysate(必做)学习任务:学习使用stat(1),并用C语言实现提交学习stat(1)的截图man-k,grep-r的使用伪代码产品代码mystate.c,提交码云链接测试代码,mysta......
  • 信息安全系统设计与实现学习笔记7
    一、知识点归纳以及自己最有收获的内容1、知识点归纳第4章并发编程1、并行顺序算法——begin-end包含多个步骤,通过单个任务依次执行,每次执行一个步骤并行算法—......
  • 使用基于注意力的编码器-解码器实现医学图像描述
    什么是图像描述图像描述是生成图像文本描述的过程。它使用自然语言处理和计算机视觉来为图像生成描述的文本字幕。一幅图像可以有很多个不同的描述,但是只要它正确地描述了......
  • 在线问题反馈模块实战(八)​:实现图片上传功能(上)
    ......
  • Android平台RTSP、RTMP播放端如何实现YUV或ARGB数据按设定角度旋转
    做音视频RTSP或RTMP直播播放器的时候,不免会遇到这样的诉求,实时播放或快照的时候,由于前端摄像头安装角度不一定是正向,导致播放或快照的时候,视频view显示的画面是呈90°180°......
  • python实现markdown文档编辑器应用
    常用的文档编辑器富文本编辑器,ckeditormarkdown编辑器,mdeditor项目中想要应用markdown编辑器:添加和编辑的页面中textarea输入框->转换为markdown编辑器1.tex......
  • 改进ls的实现
    根据图示,改进lsls:显示文件目录列表-a:显示所有的文件,包括隐藏文件-l:列出长数据串,显示出文件的属性与权限等数据信息(常用)-i:结合-l参数列出每个文件的inode-d:仅列......
  • 实现查询连续3天登陆的用户
    sql写出连续三天都登录的用户1、创建表createtabletest_user_login_3days(user_idint,login_datestring); 2、数据准备insertintotest_user_login_3daysvalue......
  • kvm使用NFS共享文件夹
    NFS主机配置yum-yinstallnet-toolsyum-yinstallvimyum-yinstallnfs-utilsmkdir/opt/kvmshareecho"/opt/kvmshare192.168.35.10(rw,sync,no_root_squash)"......