学习Spring Session和Redis解决分布式Session跨域共享问题

学习Spring Session和Redis解决分布式Session跨域共享问题

使用spring sessionredis解决分布式session跨域共享问题 

现象阐述:

 在项目中前后端代码未做分离,在两台实例的情况下服务正常运行偶尔会弹出类似需要重新登录的提示,后台报错信息

学习Spring Session和Redis解决分布式Session跨域共享问题

这是处理器异常  原因并不明显

增加机器实例后,在访问前端页面的时候,一直重复访问登录页面,导致页面302,种种迹象表明是登录配置的问题引起的。

相关专题推荐:php session (包含图文、视频、案例)

问题引入:Session不能共享导致不同机器之间轮询要求登录导致最终的服务异常

解决方案:使用Spring Session和Redis解决分布式Session跨域共享问题

解决配置:

1 )添加依赖      

  org.springframework.session  spring-session-data-redis  1.2.0.RELEASE  org.apache.velocity  velocity  1.7

登录后复制

)web.xml配置文件添加:

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

登录后复制

3) Spring.xml的配置

            

登录后复制

解析:

1、web中DelegatingFilterProxy 类:属于代理fiter,它会在tomcat启动后开始加载web.xml中的filter时将filter的管理交给spring中的bean  也就是第三步的配置 引入RedisHttpSessionConfiguration

2、RedisHttpSessionConfiguration继承了SpringHttpSessionConfiguration这个类,这个类很重要,SpringHttpSessionConfiguration通过@Bean的方式将springSessionRepositoryFilter注入到容器中

学习Spring Session和Redis解决分布式Session跨域共享问题

学习Spring Session和Redis解决分布式Session跨域共享问题

3、SessionRepositoryFilter这个过滤器就是前边DelegatingFilterProxy查找的过滤器SessionRepositoryFilter是关键,具体怎么关联起来的呢?

如果未指定init-param参数的话,DelegatingFilterProxy就会把filter-name作为要查找的Bean对象,这也是DelegatingFilterProxy类的作用。可以看出每一个请求都会经过该filter,经过该filter的请求也会相应的经过springSessionRepositoryFilter这个过滤器,那么我们就接着看一下springSessionRepositoryFilter这个过滤器 

4、SessionRepositoryFilter的作用就是替换容器默认的javax.servlet.http.HttpSession支持为org.springframework.session.Session。

SessionRepositoryFilter的主要方法和属性如下: 

è¿éåå¾çæè¿°

5、其中SessionRepositoryResponseWrapper、SessionRepositoryRequestWrapper、HttpSessionWrapper为内部类,这个也是很关键的。例如SessionRepositoryRequestWrapper类 

è¿éåå¾çæè¿°

可以看出SessionRepositoryRequestWrapper继承了javax.servlet.http.HttpServletRequestWrapper这个类,我们知道HttpServletRequest接口的默认实现是有HttpServletRequestWrapper的,如下 

è¿éåå¾çæè¿°

6、因为SessionRepositoryRequestWrapper继承了HttpServletRequestWrapper,而HttpServletRequestWrapper实现了HttpServletRequest接口,在SessionRepositoryRequestWrapper又重写了HttpServletRequest接口中的一些方法,所以才会有:getSession、changeSessionId等这些方法。 到此,我们应该大致明白了,原有的request请求和response都被重新进行了包装。我们也就明白了原有的HttpSeesion是如何被Spring Session替换掉的。

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

我们通过快捷键查看request.getSession() 的具体实现,就可以看出已经有了SessionRepositoryRequestWrapper 重写的方法。 上述有两个默认的实现,一个是原始的,一个是Spring Session实现的,具体选用哪一种作为实现,这就是我们上边说的DelegatingFilterProxy 代理的作用了,他会将每一个请求过滤,经过DelegatingFilterProxy的每一个请求也会经过springSessionRepositoryFilter过滤器,springSessionRepositoryFilter过滤器就实现了将原有request到SessionRepositoryRequestWrapper的转换,这就是实现了具体的流程!

request.getSession().setAttribute(name, value)的实现: 追踪代码,可以到达下边内容

è¿éåå¾çæè¿°可以看到有Redis相关的操作! 至此,我们应该清楚了,Spring Session的工作原理了!虽然下边的过程没有再去介绍,但是已经很清楚的理解了。

相关学习推荐:redis视频教程

以上就是学习Spring Session和Redis解决分布式Session跨域共享问题的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2042684.html

(0)
上一篇 2025年2月24日 00:45:18
下一篇 2025年2月23日 19:22:32

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Redis实现Session共享详解

    Redis实现Session共享 这几天在做session共享这么一个小模块,也查了好多资料,给我的感觉,就是太乱了,一直找不到我想要的东西,几乎全部实现方法都与我的想法不一样,在这里,我总结一下自己是如何用Redis实现session共享…

    2025年2月24日
    200
  • Redis是单线程的原因及高并发快的3大原因详解

    下面由redis教程栏目给大家介绍redis是单线程的原因及高并发快的3大原因详解,希望对需要的朋友有所帮助! Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快;2.redis是单线程的,省去了很多上下文切换线…

    2025年2月24日
    200
  • Redis下载并安装

    下面由redis教程栏目给大家介绍redis下载、redis安装的具体方法步骤,希望对需要的朋友有所帮助! Redis下载并安装 Redis在GitHub上有一个活跃的社区。这些年来,大量的pull request被提出和合并,作者Anti…

    2025年2月24日
    200
  • redis中set和hset的区别和使用场景

    下面由redis教程栏目给大家介绍redis中set和hset的区别和使用场景,希望对需要的朋友有所帮助! redis中存数据时,到底什么时候用  hset 相比于 set 存数据时又有什么不一样? set  就是普通的已key-value…

    2025年2月24日
    200
  • 如何使用Redis实现排行榜功能

    下面由redis教程栏目给大家介绍使用redis实现排行榜功能的方法,希望对需要的朋友有所帮助! 排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。 一般排行榜都是有实效性的,比如“用户积分榜”。…

    2025年2月24日
    200
  • php redis批量删除key的方法

    php redis删除key的方法:首先使用scan命令增量迭代的方式遍历出以【XX】为前缀的key;然后通过unlink函数删除指定的key即可。 推荐:《redis教程》 php redis批量删除key 摘要 使用scan命令增量迭代…

    2025年2月24日
    200
  • redis如何设置开机自启动

    下面由redis教程栏目给大家介绍使用redis实现排行榜功能的方法,希望对需要的朋友有所帮助! 1、拷贝 redis 安装目前下的 /usr/local/redis-4.0.8/utils/redis_init_script 到 /etc…

    2025年2月24日
    200
  • 详解Redis中5种数据结构的使用场景

    下面由redis教程栏目给大家介绍redis中5种数据结构的使用场景,本文对redis中的5种数据类型string、hash、list、set、sorted set做了讲解,需要的朋友可以参考下! 一、redis 数据结构使用场景 原来看过…

    2025年2月24日
    200
  • 2023年最新redis面试题大全及答案(收藏)

    因为Redis出色的高性能和并发,在大流量网站中必须要要用到的缓存技术,如果你想技术提升或者换更有挑战性的工作,那Redis是肯定需要掌握的! 今天【创想鸟】为同学们总结了一些redis面试中常被问到的问题,除了这些redis常见面试题,我…

    2025年2月24日
    200
  • PHP redis队列如何实现历史搜索功能

    下面由redis教程栏目给大家介绍redis队列实现历史搜索功能的方法,希望对需要的朋友有所帮助! redis队列实现历史搜索功能 1、使用phpinfo()函数查看你的配置,匹配对应的redis扩展版本(注:以下案例为window系统下进…

    2025年2月24日 数据库
    200

发表回复

登录后才能评论