广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈Spring Session工作原理
  • 473
分享到

浅谈Spring Session工作原理

2024-04-02 19:04:59 473人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、引入背景2、使用方法3、工作流程4、缓存机制5、事件订阅6、总结1、引入背景 Http协议本身是无状态的,为了保存会话信息,浏览器Cookie通过SessionID标识会话请

1、引入背景

Http协议本身是无状态的,为了保存会话信息,浏览器Cookie通过SessionID标识会话请求,服务器以SessionID为key来存储会话信息。在单实例应用中,可以考虑应用进程自身存储,随着应用体量的增长,需要横向扩容,多实例session共享问题随之而来。

应用部署在Tomcat时,session是由Tomcat内存维护,如果应用部署多个实例,session就不能共享。spring Session就是解决为了解决分布式场景中的session共享问题。

2、使用方法

Spring Session支持存储在Hazelcast 、RedismongoDB、关系型数据库,本文主要讨论session存储在Redis。

WEB.xml配置:


<!-- spring session -->
  <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>
    private void touch(String key) {
        //并不是直接删除 key,而只是访问 key,通过惰性删除确保spring:session:sessions:expires键实时删除,
        // 同时也保证多线程并发续签的场景下,key移动到不同spring:session:expirations键里面时,
        //以spring:session:sessions:expires键实际ttl时间为准
        this.redis.hasKey(key);
    }

5、事件订阅

ConfigureNotifyKeyspaceEventsAction,开启键空间通知:


public void configure(RedisConnection connection) {
       String notifyOptions = getNotifyOptions(connection);
       String customizedNotifyOptions = notifyOptions;
       if (!customizedNotifyOptions.contains("E")) {
           customizedNotifyOptions += "E";
       }
       boolean A = customizedNotifyOptions.contains("A");
       if (!(A || customizedNotifyOptions.contains("g"))) {
           customizedNotifyOptions += "g";
       }
       if (!(A || customizedNotifyOptions.contains("x"))) {
           customizedNotifyOptions += "x";
       }
       if (!notifyOptions.equals(customizedNotifyOptions)) {
           connection.setConfig(CONFIG_NOTIFY_KEYSPACE_EVENTS, customizedNotifyOptions);
       }
   }

RedishttpsessionConfiguration,注册监听事件:


@Bean
 public RedisMessageListenerContainer redisMessageListenerContainer(
         RedisConnectionFactory connectionFactory,
         RedisOperationsSessionRepository messageListener) {
             ......
     //psubscribe del和expired事件
     container.addMessageListener(messageListener,
             Arrays.asList(new PatternTopic("__keyevent@*:del"),
                     new PatternTopic("__keyevent@*:expired")));
     //psubscribe created事件
     container.addMessageListener(messageListener, Arrays.asList(new PatternTopic(
             messageListener.getSessionCreatedChannelPrefix() + "*")));
     return container;
 }

RedisOperationsSessionRepository,事件处理:


public void onMessage(Message message, byte[] pattern) {
      ......
      if (channel.startsWith(getSessionCreatedChannelPrefix())) {
          ...
          //处理spring:session created事件
          handleCreated(loaded, channel);
          return;
      }
 
      //非spring:session:sessions:expires事件不做处理
      String body = new String(messageBody);
      if (!body.startsWith(getExpiredKeyPrefix())) {
          return;
      }
 
      boolean isDeleted = channel.endsWith(":del");
      if (isDeleted || channel.endsWith(":expired")) {
          ......
          if (isDeleted) {
              //处理spring:session:sessions:expires del事件
              handleDeleted(sessionId, session);
          }
          else {
              //处理spring:session:sessions:expires expired事件
              handleExpired(sessionId, session);
          }
          ......
          return;
      }
  }

事件订阅样例:


@Component
public class SessionExpiredListener implements ApplicationListener<SessionExpiredEvent> {
    @Override
    public void onApplicationEvent(SessionExpiredEvent event) {
        ......
    }
}

6、总结

Spring Session给我们提供了很好的分布式环境下资源共享问题解决思路,其基于Servlet 规范实现,业务使用时只需要简单配置就可以实现session共享,做到与业务低耦合,这都是以后我们项目开发中可以借签的设计理念。

以上就是浅谈Spring Session工作原理的详细内容,更多关于Spring Session的资料请关注编程网其它相关文章!

--结束END--

本文标题: 浅谈Spring Session工作原理

本文链接: https://www.lsjlt.com/news/128458.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈Spring Session工作原理
    目录1、引入背景2、使用方法3、工作流程4、缓存机制5、事件订阅6、总结1、引入背景 HTTP协议本身是无状态的,为了保存会话信息,浏览器Cookie通过SessionID标识会话请...
    99+
    2022-11-12
  • 浅谈Android中AsyncTask的工作原理
    目录概述AsyncTask使用方法AsyncTask的4个核心方法AsyncTask的工作原理概述 实际上,AsyncTask内部是封装了Thread和Handler。虽然Async...
    99+
    2022-11-12
  • 浅谈Vue3中key的作用和工作原理
    这个key属性有什么作用呢?我们先来看一下官方的解释: kekey属性主要用在Vue的虚拟DOM diff算法中,在新旧nodes对比时辨识Vnodes; 如果不使...
    99+
    2022-11-12
  • 浅谈swoole的作用与原理
    目录PHP 中的 Node ?Swoole 到底是什么?如何让它运行?使用 Docker 运行 SwooleSwoole 可以做什么?基于 Swoole 实现 HTTP 服务HTTP...
    99+
    2022-11-12
  • 浅谈Springrefresh的工作流程
    目录功能分类具体步骤1. prepareRefresh2. obtainFreshBeanFactory3. prepareBeanFactory4. postProcessBean...
    99+
    2023-05-17
    Spring refresh refresh工作流程
  • 浅谈SpringSecurity基本原理
    目录一、SpringSecurity 本质二、典型过滤器2.1 FilterSecurityInterceptor2.2 ExceptionTranslationFilter2.3 ...
    99+
    2022-11-12
  • 在java中session的工作原理
    java中session的工作原理:在创建Session对象时,会有一个SESSION ID,它是唯一的、不重复的、不容易找到规律的字符串。在创建Session对象时,同时创建一个特殊的Cookie对象,并且会将这个特殊的Cookie对象携...
    99+
    2022-10-08
  • 浅谈mysql join底层原理
    目录join算法驱动表和非驱动表的区别1、Simple Nested-Loop Join,简单嵌套-无索引的情况2、Index Nested-Loop Join-有索引的情况3、Block Nested-Loop J...
    99+
    2022-05-30
    mysql join底层原理 mysql join
  • 浅谈JMeter engine启动原理
    目录一、简介二、配置简介三、开始原理讲解四、JMeter 引擎启动链路图一、简介 本文主要介绍jmeter在控制台在点击执行之后底层所做的一些主要事情及内容,由于便于断点调试采用GU...
    99+
    2022-11-12
  • 浅谈Webpack4 plugins 实现原理
    目录前言认识实践出真知前言 在 wabpack 中核心功能除了 loader 应该就是 plugins 插件了,它是在webpack执行过程中会广播一系列事件,plugin 会监听...
    99+
    2022-11-12
  • 浅谈MySQL之浅入深出页原理
    目录一、页的概览二、Infimum 和 Supremum三、使用Page Directory四、页的真实面貌4.1、File Header4.2、Page Header4.3、Infimum & Suprem...
    99+
    2022-05-19
    MySQL 页原理
  • java session的工作原理是什么
    Java中的Session是一种用于在服务器端存储用户数据的机制。它的工作原理如下:1. 当用户第一次访问服务器时,服务器会为该用户...
    99+
    2023-09-20
    java
  • Spring的工作原理介绍
    本篇内容主要讲解“Spring的工作原理介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring的工作原理介绍”吧!spring原理内部最核心的就是IOC了,动态注入,让一个对象的创建不用...
    99+
    2023-05-30
    spring
  • Spring @Transactional工作原理详解
    本文将深入研究Spring的事务管理。主要介绍@Transactional在底层是如何工作的。之后的文章将介绍:propagation(事务传播)和isolation(隔离性)等属性的使用事务使用的陷阱有哪些以及如何避免JPA和事务管理很重...
    99+
    2023-05-30
  • 浅谈Vue插槽实现原理
    目录一、样例代码二、透过现象看本质三、实现原理四、父组件编译阶段五、父组件生成渲染方法六、父组件生成VNode七、子组件状态初始化八、子组件编译阶段九、子组件生成渲染方法十、使用技巧...
    99+
    2022-11-12
  • 浅谈消息队列的原理
    什么是消息队列 这样的场景你一定不陌生:小王到M记点餐之后,服务员给了他一个号牌,并让他在柜台桌子前方等待叫号取餐。每个人都按照自己付款拿到的号牌顺序排队等叫号。即使店里人再多,也不会显得没有秩序。在上述场...
    99+
    2022-10-18
  • 浅谈springboot自动装配原理
    目录一、SpringBootApplication二、案例三、Condition四、案例升级五、小结一、SpringBootApplication @Target(Element...
    99+
    2022-11-12
  • 浅谈React底层实现原理
    目录1. props,state与render函数关系,数据和页面如何实现互相联动?2. React中的虚拟DOM常规思路改良思路(仍使用DOM)React的思路深入理解虚拟DOM3...
    99+
    2022-11-13
  • Node.js中require的工作原理浅析
    几乎所有的Node.js开发人员可以告诉你`require()`函数做什么,但我们又有多少人真正知道它是如何工作的?我们每天都使用它来加载库和模块,但它的行为,对于我们来说反而是一个谜。 出于好奇,我钻研了...
    99+
    2022-06-04
    工作原理 Node js
  • 深入浅析HashMap的工作原理
    这篇文章给大家介绍深入浅析HashMap的工作原理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集...
    99+
    2023-05-31
    hashmap
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作