Spring-Session使用配置(分布式共享session配置)

10 篇文章 0 订阅
6 篇文章 0 订阅

 

原文地址:http://www.osheep.cn/1428.html

 

分布式集群部署是目前大多数中小型网站都在使用的一种轻部署模式;
集群部署直接面临的一个问题就是session不一致的问题,因为单节点部署的session直接存储在Web容器的缓存中,这种方式可以通过session复制的策略来共享session;但是不推荐;


有两种大家比较常用的配置方式来共享session,其原理都是依赖于统一的中间缓存服务器;

方案一:

基于Web容器配置,比如每个集群节点Tomcat,在context.xml中添加RedisManager的配置;

方案二:

使用Spring提供的session共享组件,基于Redis等缓存服务器自己管理session,优点是部署轻便,无需修改部署容器配置,自己能够灵活使用;

以下重点分析方案二的使用:

  1. 添加依赖
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>1.2.0.RELEASE</version>
</dependency>
  1. spring-mvc.xml配置文件添加:
<!-- Redis 连接池 配置 -->
<bean id="redisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!--<property name="maxActive" value="32"></property>-->
    <property name="maxIdle" value="6"></property>
    <!--<property name="maxWait" value="15000"></property>-->
    <property name="minEvictableIdleTimeMillis" value="300000"></property>
    <property name="numTestsPerEvictionRun" value="3"></property>
    <property name="timeBetweenEvictionRunsMillis" value="60000"></property>
    <!--<property name="whenExhaustedAction" value="1"></property>-->
</bean>
<!-- Redis 连接工厂 配置 -->
<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
      destroy-method="destroy" >
    <property name="poolConfig" ref="redisPoolConfig"></property>
    <property name="hostName" value="${redis.hostName}"></property>
    <property name="port" value="${redis.port}"></property>
    <property name="password" value="${redis.password}"></property>
    <property name="database" value="${redis.database}"></property>
    <property name="timeout" value="${redis.timeout}"></property>
    <property name="usePool" value="${redis.usePool}"></property>
</bean>
<!-- Spring Session 管理 -->
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>

<!-- 让Spring Session不再执行config命令 -->
<util:constant static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>
  1. web.xml添加
<!-- Spring Session Filter -->
<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- Spring Session Filter -->

这样就可以实现分布式Session了。

注意:
1. spring的这个配置文件一定要写在web.xml的部分,写在其他地方不行。
1. filter的名字必须是springSessionRepositoryFilter
1. 如果使用了shiro,web.xml中一定要把放在最前面,然后写shiro的Filter配置,再写spring-session的Filter配置。后面就是其他的编码和servlet配置了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Session Data Redis 是 Spring Session 提供的一种基于 Redis 的分布式会话管理方案。它可以将用户的会话信息存储在 Redis 中,实现分布式场景下的会话共享使用 Spring Session Data Redis 需要进行以下步骤: 1. 添加 Redis 依赖 在项目的 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> ``` 2. 配置 Redis 连接 在 Spring Boot 应用的配置文件中,添加 Redis 的连接配置: ```yaml spring: redis: host: localhost port: 6379 ``` 3. 启用 Spring Session 在 Spring Boot 应用的启动类上添加 @EnableRedisHttpSession 注解,启用 Spring Session: ```java @SpringBootApplication @EnableRedisHttpSession public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 4. 使用 Spring Session 在需要获取当前用户的会话信息时,注入 HttpSession 对象即可: ```java @Controller public class MyController { @GetMapping("/hello") public String hello(HttpSession session) { String username = (String) session.getAttribute("username"); return "Hello, " + username + "!"; } } ``` Spring Session Data Redis 还支持一些高级特性,如会话过期时间、会话销毁监听器等。需要了解更多详情,请参考官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值