Spring Session Data Redis 配置中遇到的坑

spring-session-data-redis核心原理 本文介绍了分布式Session的实现原理及配置方法。Session通过在服务器端保存用户登录信息,使用sessionId进行鉴权。在微服务架构中,通过Redis实现分布式Session共享。核心配置使用@EnableRedisHttpSession注解,可设置过期时间、命名空间等参数。RedisHttpSessionConfiguration类负责读取配置并创建RedisIndexedSessionRepository来管理Session操作。通过引入相关依赖和配置,可实现跨服务的Session共享,解决分 阅读详情
AI摘要

本文详细介绍了如何使用Spring Session Data Redis实现Session共享,包括配置步骤、常见问题及解决方案。特别关注了版本兼容性和静态资源访问配置。

说道Session共享,从网上搜索,有几种实现方式,比较普遍的 Tomcat Session Redis,这种是需要在tomcat容器里增加几个jar包,并修改Tomcat里的content.xml增加一条语句,实现session共享,此方法依赖于 tomcat.
还有一种是 Spring-Session-Data-Redis,此方法对servlet容器都有效,不局限于tomcat,也是比较普遍的一种方法,具体可自行百度了解
今天要说的是在配置SpringSessionDataRedis过程中遇到的坑
基本配置方式也比较简单
第一步:pom.xml中引入依赖
首先要引入依赖,此依赖并不是jar,而是一个空包里面还有对spring-session,redis等几个必要组件的依赖
<!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis -->
<dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
            <version>1.3.1.RELEASE </version>
</dependency>
注意:此地方有一个比较坑爹地方,当打开Maven仓库,可以看到有一个对Spring版本的依赖的要求,对于1.3.1的SpringSession,对Spring的依赖最低4.3.4,如果依赖低于这个版本,则会报错Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.session.SessionRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}, 特别注意,引入不同的版本时,可能会引起原有jar包版本不兼容
第二步:Spring-mvc.xml中增加 redisHttpSessionConfiguration
    <!-- Spring Session Redis 共享 http://www.cnblogs.com/andyfengzp/p/6434287.html -->
     <bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="1800"/>
    </bean>
注意:由于使用了这里的配置,由redis负责接管Session,原来web.xml里配置的Session超时时间就会失效了
    <session-config>
        <session-timeout>60</session-timeout>
        <cookie-config>
            <http-only>true</http-only>
        </cookie-config>
    </session-config>

第三步:Web.xml中配置filter

    <!-- Spring Session Redis 共享 需要放在filter的第一个  http://www.cnblogs.com/andyfengzp/p/6434287.html -->
    <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>
    </filter-mapping>
注意:这个filter要写在比较靠前的第一个的位置

以上这几步配置完成后,基本就可以实现Session的共享了。
但是这里还有一个情况,项目启动后,左右的静态资源都无法访问了,这个是和原来的版本有不一样的地方,
Spring4.3,这里需要注意,所有Spring的xml的配置文件里标签要变为  -4.3.xsd
<!-- 静态文件资源访问配置 --> 要注意这里的静态文件不要放到WEB-INF里,要放到项目内,例如项目下的resources
<mvc:resources mapping="/**" location="/resources/" />这样就可以放行静态文件的访问


还有一个比较大的坑,使用Spring Session实际是Spring加入了一个Filter,其本质是:对每一个请求的request都会被DelegatingFilterProxy进行了一次封装。那么,在Controller里面拿出的request实际上是封装后的request,因为Session要存在Session,所以调用request.getSession()的时候,实际上拿到是Spring封装后的session ,因此对于request实际上拿到是Spring封装后的request。那么可能会导致Request.getInputStream无法获取到流数据,对于使用raw格式,即非Key,Value参数的提交 会被Spring-Session获取, 当 contentType 为 application/x-www-form-urlencoded 时,就会被解析成 Paramater ,从而导致request.getInputStream的数据再获取时为空了。还有就是Controller里如果用到了request.setCharacterEncoding("GBK"); 设置字符集,这样的请求也无法生效,因为request.setCharacterEncoding只有在request.getSession或者request.getParamater之前使用有效,而由于使用Spring Session加入了filter,所以Controller里的request.setCharacterEncoding这种方式转编码就失效了,解决办法,可以是new String(request.getParameter(key).getBytes(), "GBK"),获取到参数后转码

相关连接





Spring Boot2 系列教程(二十八)Spring Boot 整合 Session 共享 由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升, 阅读详情

相关推荐

springboot2.0 session存储到redis整合过程中踩倒的坑

之前一直用的是springboot1.5 在使用session整合到redis时 按照一些博客上的教程没有问题 但是这次采用的是springboot2.0的版本,把以前老项目的一些东西直接复制粘贴过来 pom.xml依赖如下 <dependency> <groupId>org.springframework.boot</groupId> ...

weixin_43706845的博客 3506

分布式Session(Spring-session-data-redis)

1、在pom中添加如下依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency>

Emm_Sona的博客 3719

别再搞混了!Redis、Jedis、Lettuce、Spring Data Redis、Redisson、Spring Session Redis 一次讲透

平时做Java开发,只要引入Redis做缓存,pom.xml里总会看到一堆名字相似的东西:一会儿是jedis,一会儿是lettuce,还有Spring Data Redis、Redisson、Spring Session Redis……刚接触的时候真的头大,甚至会把Redis服务端和Java客户端混为一谈,踩了不少坑。今天就把这些东西理清楚,分清谁是底层、谁是封装、谁是专门解决某个场景的。

博客 614

spring-session-data-redis

spring-session-data-redis引入依赖添加配置使用 引入依赖 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <gro

qq_45134546的博客 2139

spring-session-data-redis-2.0.4.RELEASE-API文档-中英对照版.zip

赠送jar包:spring-session-data-redis-2.0.4.RELEASE.jar; 赠送原API文档:spring-session-data-redis-2.0.4.RELEASE-javadoc.jar; 赠送源代码:spring-session-data-redis-2.0.4.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-session-data-redis-2.0.4.RELEASE.pom; 包含翻译后的API文档:spring-session-data-redis-2.0.4.RELEASE-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.springframework.session:spring-session-data-redis:2.0.4.RELEASE; 标签:springframework、session、spring、data、redis、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文

HyperLPR3车牌识别-Android-SDK光速部署与使用

基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework.快速部署AndroidSDK

tunm 6118

Spring Boot分布式部署Session共享实战:用Redis解决多实例会话丢失问题

在微服务与多实例部署架构下,HTTP Session默认存储在Web容器本地内存,当负载均衡将请求分发到不同节点时,用户登录状态极易丢失。Session共享的本质是将会话数据从各节点内存抽离至统一存储层,而Redis凭借内存高速读写、Key过期机制等特性,成为实现分布式会话管理的首选方案。本文从Session丢失的根因出发,对比Spring Session Data Redis、Tomcat Session Manager与Cookie-Based Session三条技术路线,并基于Spring Boot给

weixin_31155097的博客 208

超速U盘选购避坑指南:如何通过Rx Detect机制识别真伪USB3.0设备

本文深入解析了USB 3.0超速U盘的选购避坑要点,重点介绍了通过Rx Detect机制识别真伪设备的核心原理。文章提供了从软件检测到实际性能测试的完整方案,帮助消费者和技术人员有效辨别虚假的USB3.0设备,确保获得真正的超速传输体验。

weixin_29189373的博客 443

使用spring-session-data-redis实现HTTP Session集中管理原理

在使用spring-session-data-redis时只需要在@Configuration类上加上@EnableSpringHttpSession即可实现使用Redis集中存储Session。将此批注添加到@Configuration类,以将SessionRepositoryFilter公开为名为“springSessionRepositoryFilter”的bean,并由用户提供的Sessi...

通往神秘的道路的专栏 2万+

2025华为od机试真题B卷【版本管理】JavaScript实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 254

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表示的是阳性样本的比例

data+scenario+science+insight 1223

【SpringBoot框架篇】19.集成spring-session利用redis来实现session共享

集成spring-session利用redis来实现session共享

皓亮君的博客 3600

【论文复现】Applied Intelligence 2025:Auto-PU正例无标签学习的自动化实现与GPT-5.4辅助编程实战

正例-无标签学习(Positive-Unlabelled Learning, PU Learning)是机器学习领域处理"只有正例标签,负例完全未知"场景的重要技术。本文基于2025年发表于Applied Intelligence的最新研究成果,详细阐述如何从零复现Auto-PU框架(包含GA-Auto-PU、BO-Auto-PU、EBO-Auto-PU三种优化器)。

nmdbbzcl的博客 1388

Session(Spring-session-data-redis)

https://www.jianshu.com/p/97c714e2ca7d 1、在pom中添加如下依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependenc.

qq_27088383的博客 3511

【Android调试】高通adb识别不到设备的完整排查指南:从驱动到端口一步到位

本文系统梳理高通(Qualcomm)平台Android设备adb无法识别的完整排查流程。从最基础的USB连接检查开始,到Windows设备管理器中驱动状态的判断、高通USB驱动的正确安装与更新方法,再到adb端口被占用、USB调试未开启、驱动签名校验失败等高频场景的解决方案。每一步均配截图和操作命令,文末附常见报错速查表,适合做系统开发、刷机调试或者Android Framework bringup时遇到adb不通的工程师快速定位。

weixin_44081096的博客 279

学Simulink--基础光伏储能场景实例:基于Simulink的光储微电网主从控制策略仿真

摘要:本文详细介绍基于Simulink的光储微电网主从控制策略仿真方法。通过"储能V/f控制+光伏PQ控制"架构,实现孤岛运行时电压频率稳定和功率平衡。文章包含系统建模步骤、核心控制算法实现(附MATLAB代码)、三种典型工况仿真测试(稳态、光伏突变、负荷波动),结果显示系统满足电压偏差<±2.5%、频率偏差<±0.3%、动态响应<1s的性能要求。最后提出双主冗余、分层控制等优化方向,为光储微电网控制提供完整仿真解决方案。

amy_mhd的博客 74

配置spring-security对redis中session的同步处理,通过sessionRegistry统计在线用户

问题描述: 登录用户的session在redis失效、清除或者用户退出系统后,系统中的sessionRegistry中session依然存在,并未同步失效 系统架构: Springboot2 + SpringSecurity + spring-session-data-redis + Redis 1. Redis配置(当然可以只加注解,使用默认配置) /** redis配置 */ @Confi...

Janche的博客 8719

YOLOv8改进 | Conv篇:基于FasterBlock与C2f结构的二次创新,参数量下降70万【附保姆级代码】

通过引入FasterBlock二次创新C2f结构,我们成功地对YOLOv8模型进行了优化,显著降低了其参数量,并提升了推理速度,而精度保持不变甚至有所提升。该模型在多个实际应用场景中展现出了优异的性能,尤其是在嵌入式设备、移动端和自动驾驶等领域,具有广泛的应用潜力。未来的研究将进一步优化模型结构,探索更多的应用场景,为目标检测技术的发展做出贡献。

一键难忘的博客 3214

spring-session-data-redis升级之坑

因为某些组件低版本存在漏洞问题,本次对项目的springboot版本从1.x升级到了2.x,因为其他相关的中间件也随着一起升级,在升级最后发现项目用户信息无法获取到了。

weixin_39439156的博客 2037

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

spring boot2.x设置session有效时间_spring data redis集成以及session共享

redis 是一款基于内存存储的高性能缓存框架,支持多种数据结构如string, hash, list, set、sorted set、bitmap等多种数据类型,也提供了很多高可用功能如rdb和aof备份、哨兵模式和集群模式部署。redis有许多的应用场景,一般用于替代一些数据库访问热点数据操作减少数据库压力以及提高性能,也可用于session共享、排行榜等。redis是业内最流行的一款缓存框架...

weixin_30780735的博客 839

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

springboot 下 spring-session-data-redis + redis + nginx 实现session共享

1: pom引入依赖 <!-- spring boot 与 redis 应用的基本配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-...

tang_jian_dong的博客 5737

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

struts2+springsecurity+spring-session-data-redis使用redis存储session

springsecurity做权限验证,采用默认的session管理,在系统重新部署启动之后,之前登录的用户session无法被保存,需要用户重新登录,这里使用redis来做session存储,系统重启之后,session还在,无需重新登录。 使用redis做session存储,本身配置比较简单,但是这里和struts2结合,就需要注意。 springSessionRepositoryFilt...

feinifi的博客 2129

spring Boot redis连接池配置,Spring Session配置

1.POM配置 redis.clients jedis 2.9.0 org.springframework.session spring-session-data-redis 2.配置文件application.properties # REDIS (RedisProperties) # Redis数据库索引(默认为0) spr

yangliuhbhd的博客 2万+

Spring-session(spring-session-data-redis)实现分布式下Session共享

由于公司项目是单节点的,同事在开发过程中并未做Session共享,由于流量上升后,领导未经过了解直接加机器、加节点;大家可想而知了,项目中运行过程出现很多问题,经过同事们系列排查,才知道是由于上面原因导致拿不到Session。 大家在项目采用Spring-Session时一定要注意项目中Spring的版本,否则会给你带成很多坑,首先,Spring-Session所需的最低SPring版本是3.2...

ycb1689的专栏 5752

在spring 里面,spring-session 和 spring-session-data-redis 结合让项目平滑升级与redis 缓存的一些运用

之前每次升级的时候,还要停集群节点,然后升级以后再启动,需求需要不停机升级! 然后实现是用springsession 结合redis 做的缓存!引入jar  &lt;dependency&gt;            &lt;groupId&gt;org.springframework.session&lt;/groupId&gt;            &lt;artifactId&gt;spr...

bianmadetangyuan的博客 2953

springmvc框架下使用spring-session-data-redis集成redis实现session共享

1、安装redis 具体过程不再讲 2、配置redis bind 127.0.0.1 192.168.1.100 #指定redis绑定的主机地址 port 6379 #指定访问redis服务端的端口 timeout 1800 #指定客户端连接redis服务器时,当闲置的时间为多少(如1800秒)时,关闭连接。 这个很重要 如果不设置的话,redis连接数会越来越大,直到最大值后报异常 ...

lgklm的专栏 1790
上一篇: 使用zinin的RedisSession共享时报java.lang.ClassCastException转换错误的最终解决方案
下一篇: 关于用户访问请求慢,TTFB时间长的问题分析
幕紫
博客等级 码龄16年 56粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值