Session 共享问题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 在 Web 项目开发中,Session 会话管理是一个很重要的部分,用于存储与记录用户的状态或相关的数据。通常情况下 session 交由容器(tomcat)来负责存储和管理,但是如果项目部署在多台 tomcat 中,则 session 管理存在很大的问题:1. 多台 tomcat 之间无法共享 session ,当负载均衡跳转到其它 tomcat 时,session 就失效了,用户就退出了登录。2. 一旦 tomcat 容器关闭或重启也会导致 session 会话失效。

Session 共享问题

在 Web 项目开发中,Session 会话管理是一个很重要的部分,用于存储与记录用户的状态或相关的数据。

通常情况下 session 交由容器(tomcat)来负责存储和管理,但是如果项目部署在多台 tomcat 中,则 session 管理存在很大的问题:

  1. 多台 tomcat 之间无法共享 session ,当负载均衡跳转到其它 tomcat 时,session 就失效了,用户就退出了登录。
  2. 一旦 tomcat 容器关闭或重启也会导致 session 会话失效。

Spring Session 简介

Spring Session 是 Spring 家族中的一个子项目,Spring Session 提供了用于管理用户会话信息的 API 和实现。

它把 servlet 容器实现的 httpSession 替换为 spring-session ,Session 信息存储在 Redis 或其它数据库中统一管理,解决了 session 共享的问题。

Spring Session 实现

SessionRepositoryFilter 类是一个 Filter 过滤器,符合 Servlet 的规范定义,用来修改包装请求和响应。这里负责包装切换 HttpSession 至 Spring Session 的请求和响应。

在登录/登出时调用 session.setAttritube 和 session.removeAttritube 方法时,将切换为对 redis 中的 session 进行修改。

Spring Session 实现

导入依赖

<!-- Spring Boot Redis 依赖  -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>  
        <groupId>org.springframework.session</groupId>  
        <artifactId>spring-session-data-redis</artifactId>  
    </dependency>   
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-core</artifactId>
    </dependency>Copy to clipboardErrorCopied
复制代码

配置文件

配置文件 application.properties

# Spring Session 配置
# 数据源
spring.session.store-type=redis
# redis 刷新模式
spring.session.redis.flush-mode=on_save
# redis 命名空间
spring.session.redis.namespace=test_session
# session 过期时间
server.servlet.session.timeout=3600s
# Redis 配置
# Redis数据库索引
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码
spring.redis.password=1234



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
存储 JSON NoSQL
谁说Session只能存储在服务器端?
今天使用Koa遇到了一个诡异的问题,然后仔细研究了Koa-Session的实现原理,刷新了我的认知。好我们从头讲起。 先看看Session的原理是什么?
466 0
|
6月前
|
存储 前端开发 搜索推荐
使用session.setAttribute存储会话属性
使用session.setAttribute存储会话属性
|
存储
13JavaWeb基础 - Session技术
13JavaWeb基础 - Session技术
37 0
|
应用服务中间件 API
Session 会话
Session 会话
111 0
|
安全 Java 编译器
|
存储 Java 开发者
session对象
session对象
115 0
|
存储 Java API
创建session之不支持cookie的方法
创建session之response.encodeURL 详解
138 0
49session的生命周期实例
49session的生命周期实例
103 0
49session的生命周期实例