博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用SpringSession和Redis解决分布式Session共享问题
阅读量:7051 次
发布时间:2019-06-28

本文共 2186 字,大约阅读时间需要 7 分钟。

SpringSession优势

  • 遵循servlet规范,同样方式获取session,对应用代码无侵入且对于developers透明化

关键点在于做到透明和兼容

  • 接口适配:仍然使用HttpServletRequest获取session,获取到的session仍然是HttpSession类型——适配器模式
  • 类型包装增强:Session不能存储在web容器内,要外化存储——装饰模式

基本环境需求

进行使用Spring Session的话,首先的是已经安装好的有一个 Redis服务器!

添加项目依赖(最基本的依赖使用)

org.springframework.session
spring-session-data-redis
1.3.0.RELEASE
pom

(3)添加Spring配置文件

添加了必要的依赖之后,我们需要创建相应的Spring配置。Spring配置是要创建一个Servlet过滤器,它用Spring Session支持的HttpSession实现来替换容器本身HttpSession实现。这一步也是Spring Session的核心。

  
  
  

在web.xml中添加DelegatingFilterProxy(一定要放在自定义filter之前,不然会出现自定义filter中无法获取到session的问题)

springSessionRepositoryFilter
org.springframework.web.filter.DelegatingFilterProxy
springSessionRepositoryFilter
/*
REQUEST
ERROR

DelegatingFilterProxy将通过springSessionRepositoryFilter的名称查找Bean并将其转换为过滤器。对于调用DelegatingFilterProxy的每个请求,也将调用springSessionRepositoryFilter。

使用工具查看Redis内容:

对于分布式环境Session跨域共享的问题,不管是使用开源的框架还是使用自己开发的框架,都需要明白的一个问题是:在Tomcat容器中创建Session是一个很耗费内存的事情。因此,我们在自己写类似框架的时候,我们一定要注意的是,并不是Tomcat为我们创建好了Session之后,我们首先获取Session然后再上传到Redis等进行存储,而是直接有我们自己创建Session,这一点是至关重要的!

 

关于Error creating bean with name ‘enableRedisKeyspaceNotificationsInitializer’错误的处理:

添加如下配置让Spring Session不再执行config命令

<util:constant static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>

如果不添加的话,会报如下错误:

Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]:

Invocation of init method failed; nested exception is java.lang.IllegalStateException: Unable to configure Redis to keyspace notifications.
See
Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR unknown command config

转载于:https://www.cnblogs.com/yanglei-xyz/p/10813332.html

你可能感兴趣的文章
做接口测试需要哪些技能
查看>>
Nginx(十)-- 进程模型及工作原理
查看>>
辛星浅析一次ajax的实现过程
查看>>
静态网页怎样实现动态交互?-JavaScript
查看>>
JAVA IO操作:数据操作流:DataOutputStream和DataInputStream
查看>>
[Angular HTML] Overwrite input value, String.fromCharCode & input.selectionStart
查看>>
海思hi3716c机顶盒接usb摄像头和usb无线耳机时,无线耳机有时没有声音
查看>>
word2vec原理(二) 基于Hierarchical Softmax的模型
查看>>
C++中的RAII机制
查看>>
monaco editor + vue的配置
查看>>
Jenkins
查看>>
P1151 子数整数
查看>>
ext4文件系统制作 - make_ext4fs 参数介绍【转】
查看>>
spring mvc 图片上传,图片压缩、跨域解决、 按天生成文件夹 ,删除,限制为图片代码等相关配置...
查看>>
C++ STL vector(向量容器)的使用(附完整程序代码)
查看>>
Android SDK和NDK
查看>>
动态代理proxy与CGLib的区别
查看>>
040医疗项目-模块四:采购单模块—采购单创建好之后跳转到采购单修改页面(editcgd.action)...
查看>>
Android 控件的显示隐藏上下左右移动动画
查看>>
【资料下载区】【GK101固件】更新日期2017/1/11
查看>>