SpringSession

本文探讨了Session在分布式环境中的问题,包括不同域名间的不共享及服务器之间的session不一致。提出了解决方案,如session复制、客户端cookie存储、使用Redis统一存储,并详细介绍了SpringSession的配置和使用,包括自定义CookieSerializer实现子父域名共享,以及序列化问题的处理,最终通过配置实现Session在分布式环境下的有效管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、session的原理

二、session的问题

①不同域名不能共享

②分布式同一个域名下,不同的服务器session不共享问题

三、session问题的解决方式----不同服务器不共享问题

1、session复制

2、客户端cookie的存储​编辑 3、hash一致性根据用户,到指定的机器上登录。但是远程调用还是不好解决​编辑

4、redis统一存储​编辑

5、不同域名之间问题通过设置父域名来进行解决

四、springsession-----解决子父域名不共享

1、导入依赖

2、自定义CookieSerializer,解决子域session共享问题

3、序列化问题----防止存到redis的数据是二进制流

4、开启@EnableRedisHttpSession

5、配置属性

五、测试


一、session的原理

二、session的问题

①不同域名不能共享

②分布式同一个域名下,不同的服务器session不共享问题

三、session问题的解决方式----不同服务器不共享问题

1、session复制

2、客户端cookie的存储 3、hash一致性
根据用户,到指定的机器上登录。但是远程调用还是不好解决

4、redis统一存储

5、不同域名之间问题通过设置父域名来进行解决

通过原生API的httpservletResponse这个类来设置

Cookie cookie=new Cookie("key","value");
            cookie.setDomain("父域名");
            httpServletResponse.addCookie(cookie);

四、springsession-----解决子父域名不共享

1、导入依赖

<dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

2、自定义CookieSerializer,解决子域session共享问题

@Configuration
@EnableRedisHttpSession
public class GulimallSession {
    @Bean
    public CookieSerializer cookieSerializer(){
        DefaultCookieSerializer defaultCookieSerializer=new DefaultCookieSerializer();
        defaultCookieSerializer.setDomainName("gulimall.com");
        defaultCookieSerializer.setCookieName("XJHSESSION");
        return defaultCookieSerializer;
    }
}

3、序列化问题----防止存到redis的数据是二进制流

@Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer(){
        return new GenericFastJsonRedisSerializer();
    }

4、开启@EnableRedisHttpSession

5、配置属性

spring:
  redis:
    host: 192.168.80.128
    port: 6379
  session:
    store-type: redis

五、测试

### 关于 Spring Session 的使用与配置 #### 核心概念 Spring Session 是用于管理 HTTP 会话的框架,允许开发者将原本存储在 JVM 内存中的会话数据迁移到外部存储介质中。这不仅实现了跨多个应用程序实例间的会话共享,还提高了系统的可扩展性和容错能力[^1]。 #### 配置 Redis 存储 Session 为了使 Spring 应用能够通过 Redis 实现分布式环境下的会话一致性,需引入 `spring-session-data-redis` 依赖并进行相应设置: ```xml <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> ``` 接着,在配置文件中指定连接到 Redis 的参数以及启用基于 Redis 的会话支持: ```yaml spring: redis: host: localhost port: 6379 session: store-type: redis ``` 对于 Java Config 方式的项目,则可通过如下方式开启: ```java @Configuration @EnableRedisHttpSession public class SessionConfig { } ``` 上述操作之后,所有的会话信息将会自动持久化至 Redis 中,从而实现在不同节点间无缝切换的同时保持用户状态不变[^2]。 #### 自定义 Cookie 设置 除了基本功能之外,还可以进一步定制化客户端发送给服务器端的身份验证令牌——即 JSESSIONID 所对应的 cookie 属性。比如修改其名称、路径或是增加安全性选项等: ```properties server.servlet.session.cookie.name=MY_SESSION_ID server.servlet.session.cookie.path=/customPath server.servlet.session.cookie.http-only=true server.servlet.session.cookie.secure=true ``` 以上属性可以在 application.properties 文件内直接声明;如果希望程序启动时动态调整这些值的话,则可以通过编码的形式来进行设定。 #### 场景适应性分析 采用这种方式集中管理会话具有诸多优势,特别是在面对大规模集群部署需求时尤为明显。不过值得注意的是,这样的设计增加了系统复杂度,并且可能带来额外的学习成本和技术挑战。因此建议仅当确实存在这方面的需求时再考虑实施此类解决方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值