文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring session如何实现Session共享

2023-07-06 03:49

关注

这篇文章主要介绍“Spring session如何实现Session共享”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring session如何实现Session共享”文章能帮助大家解决问题。

Redis session

用户第一次访问应用,会创建一个新的Session,并且会将Session的ID作为Cookie缓存在浏览器。下一次访问请求时,请求的头部会带有Cookie。应用通过Session ID进行查找。如果Session存在并且有效,就会继续请求。

为什么使用session共享:

如果没有Session共享,session的信息放在内存中,如果Tomcat关闭,内存中的Session就会销毁。在多实例(多个Tomcat)中无法共享,导致一个用户只能访问一个实例。

在实现共享后,只要Cookie中的Session ID 无法改变,多实例的任意一个被销毁,都不会影响用户访问。

session 共享原理:

当请求进来的时候,SessionRepositoryFilter 会先拦截到请求,将 request 和 response 对象转换成 SessionRepositoryRequestWrapper 和 SessionRepositoryResponseWrapper 。后续当第一次调用 request 的getSession方法时,会调用SessionRepositoryRequestWrapper 的getSession方法。这个方法是被重写过的,逻辑是先从 request 的属性中查找,如果找不到;再查找一个key值是"SESSION"的 Cookie,通过这个 Cookie 拿到 SessionId 去 Redis 中查找,如果查不到,就直接创建一个RedisSession 对象,同步到 Redis 中。

说的简单点就是:拦截请求,将之前在服务器内存中进行 Session 创建销毁的动作,改成在 Redis 中创建。

Spring Session提供了一套创建和管理Servlet HTTPSession的方案,Spring Session提供了集群Session功能,默认采用外置的Redis来存储Session数据,以此来解决Session共享问题。

使用过滤器拦截请求

<!-- 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>  </filter-mapping>

配置Redis

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans                         http://www.springframework.org/schema/beans/spring-beans.xsd">    <!--Jedis连接池的相关配置-->    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">        <!--最大连接数, 默认8个-->        <property name="maxTotal" value="100"></property>        <!--最大空闲连接数, 默认8个-->        <property name="maxIdle" value="50"></property>        <!--允许借调 在获取连接的时候检查有效性, 默认false-->        <property name="testOnBorrow" value="true"/>        <!--允许归还 在return给pool时,是否提前进行validate操作-->        <property name="testOnReturn" value="true"/>    </bean>    <!--配置JedisConnectionFactory-->    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">        <property name="hostName" value="192.168.175.100"/>        <property name="port" value="6379"/>        <property name="database" value="0"/>        <property name="poolConfig" ref="jedisPoolConfig"/>    </bean>    <!-- 配置session共享 -->    <bean id="redisHttpSessionConfiguration"          class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">        <property name="maxInactiveIntervalInSeconds" value="600" />    </bean></beans>

关于“Spring session如何实现Session共享”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯