nginx+spring-session+redis 实现session共享
session共享、除开ip_hash、url_hash之外的记录,过程不表、共同学习
代码实现:
全程加配置即可,无需改变原始业务逻辑代码
1、Pom依赖
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.2.1.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency>
2、Web.xml配置
注:最好放在所有filter的前面,防止被其他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>
3、Redis连接配置(只需基本连接即可、无需暴露客户端使用属性)
<!-- redis配置 --> <bean id="stringJedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy" p:host-name="xxx.xxx.xxx.xxx" p:port="xxx" p:timeout="2000" p:usePool="TRUE" p:password="xxx"> <constructor-arg index="0" ref="stringJedisPoolConfig" /> </bean> <!-- pool 基本信息配置 --> <bean id="stringJedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="100" /> <property name="maxIdle" value="50" /> <property name="minIdle" value="20" /> <property name="maxWaitMillis" value="1000" /> <property name="testOnBorrow" value="TRUE" /> <property name="softMinEvictableIdleTimeMillis" value="500" /> <property name="timeBetweenEvictionRunsMillis" value="1000" /> </bean> <!-- springsession 共享配置 --> <bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"> <property name="maxInactiveIntervalInSeconds" value="600" /> </bean>
OK 代码End!!
测试如下:
1.准备一个nginx 起两台tomcat ,并搭建一个负载(轮询方式即可、无需设置备机,不要设置ip_hash\url_hash 否则失去了这一套共享的意义) 具体实现不再啰嗦、之前的文章有提到
2.打印sessionId、看nginx转发到不同的tomcat上sessionId是否相同(没日志、直接先起一台tomcat、请求得到sessionID之后、记录该id,down掉tomcat,再启另一台,再访问,看得到的sessionID与之前的id是否一致)
测试结果:
1.未加session共享之前的结果:sessionID 不同的tomcat 得到的不同
2.加了之后,相同。
项目源码在附件里!!!
原理流转:
原理分析如下:
Req----nginx----tomcat---filter
之前的session由tomcat创建,现在交由Spring-session中的SessionRepository并保存到redis里。
Req流转:
1. Web.xml加载
content-param --> listener --> filter
2.加载spring监听之后 contextInitialized 方法执行 初始化根web应用程序上下文。
3.初始化我们配置的各种bean,加载JedisConnectionFactory初始化
4. 初始化我们配置的各种bean,进入到我们配置的RedisHttpSessionConfiguration
5.点开RedisHttpSessionConfiguration 可以看到它里面创建了N个bean,主要的几个有springSessionRepositoryFilter(这是他父类里的)、sessionRedisTemplate、sessionRepository ,由这3个bean 实例化redistemple,设置保存的存储类型为Hash,而它的参数RedisConnectionFactory由3(JedisConnectionFactory)提供
6.到filter拦截DelegatingFilterProxy 一看卧槽这是个代理,如果不指定init-param参数的话,DelegatingFilterProxy就会把filter-name作为要查找的Bean对象,这也是DelegatingFilterProxy类的作用。我们配置的是springSessionRepositoryFilter 这个东西再哪里呢?
7.第5步里面RedisHttpSessionConfiguration 初始化时会加载,它继承了OncePerRequestFilter、OncePerRequestFilter又继承了filter,就是这个玩意替换了javax.servlet.http.HttpSession支持org.springframework.session.Session
8.点进去可以看到在OncePerRequestFilter中dofilter里面加载了doFilterInternal方法,该方法被springSessionRepositoryFilter 自定义实现,除了包装了一套HttpServletRequest、HttpServletRespouse ,在finally里执行了commitSession方法,这个方法里执行了save()方法,该方法保存session用,底层执行的是RedisOperationsSessionRepository ,到这里终于和redis扯上关系了,底层通过RedisTemplate 进行存储操作key为sessionId value 为session对象放的是map
9.session过期策略,定期job 每分钟一次执行上一分钟过期的key即sessionid 方法cleanExpiredSessions,默认失效时间 1800s,自定义再maxInactiveIntervalInSeconds设置
参考:
https://blog.csdn.net/weixin_41070431/article/details/80421627
https://blog.csdn.net/u010648555/article/details/79491988
https://blog.csdn.net/xlgen157387/article/details/60321984
相关推荐
这个小例子"nginx+tomcat+redis完成session共享"旨在演示如何通过这三种技术实现跨服务器的用户会话共享,以提升用户体验并简化系统管理。以下是这些技术及其在会话共享中的作用: 1. **Nginx**:Nginx是一款高性能...
"Spring Boot + Shiro + Redis 实现 Session 共享方案二" 1. 概述 本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 ...
综上所述,"nginx+tomcat7+jdk1.7+redis--jar.rar"的解压内容用于搭建一个高效的Web服务架构,通过Nginx分发请求,利用Redis实现跨服务器的Session共享,提升系统的可扩展性和性能。在实际操作中,需要根据具体环境...
综上所述,结合SSM、Redis和Nginx,我们可以构建一个高可用、高性能的Web应用系统,实现session的跨服务器共享,并通过负载均衡策略确保服务的稳定性和可扩展性。在实际项目中,可以根据业务需求和资源状况,灵活...
在IT行业中,构建高效、可扩展的Web服务是至关重要的,而"nginx+redis实现session共享"的主题就涉及到了这一核心需求。为了实现单点登录(Single Sign-On, SSO)以及跨应用的session共享,我们可以结合使用Nginx作为...
在构建高性能、高可用的Web服务时,"nginx+redis负载均衡、session共享"是一个常见的解决方案。这个方案结合了Nginx的反向代理和负载均衡能力,以及Redis的内存数据存储和分布式特性,用于处理高并发场景下的HTTP...
"nginx+tomcat6+redis实现session共享"是一个常见的解决方案,旨在提高系统的可扩展性和高可用性。这个配置允许多个Tomcat服务器之间共享用户session,避免了用户在切换服务器时需要重新登录的问题。下面将详细介绍...
本教程将详细讲解如何利用Spring Boot、Nginx和Redis来实现高效的Session共享,以满足大规模并发场景下的会话管理需求。 **Spring Boot与Session管理** Spring Boot是基于Spring框架的快速开发工具,它简化了配置...
- **session共享**:在分布式环境中,Redis可以作为session存储,解决跨服务器的session共享问题,确保用户会话的一致性。 - **消息队列**:Redis支持发布/订阅模型,可以作为简单消息队列,用于异步处理任务或...
"redis缓存服务器Nginx+Tomcat+redis+MySQL实现session会话共享"的主题旨在探讨如何利用这些技术组件来实现这一目标。以下是相关知识点的详细说明: **Redis**:Redis是一个高性能的键值数据存储系统,常用于做缓存...
Spring Session的核心思想是将session数据从传统的JVM内存中移出,存储到一个独立的数据存储系统,如Redis,这样可以实现session在多台服务器之间的共享。 Redis是一个高性能的键值数据库,常用于缓存和消息代理。...
- `spring-session-data-redis`:Spring 提供的 `spring-session` 模块,用于集成Redis来实现Session共享。在`pom.xml`中添加对应的依赖。 - `redis.properties`:配置Redis的连接信息,如主机名、端口、密码等。 ...
SSM+Redis 实现Session共享是现代Web应用中常见的技术组合,主要目的是在分布式系统中保持用户Session的一致性。SSM是指Spring、Spring MVC和MyBatis这三大Java Web开发框架的组合,而Redis则是一种高性能的键值存储...
本资料包“springboot-nginx-redis-session共享、TCPUDP负载均衡.zip”提供了一套完整的解决方案,涉及到Spring Boot、Nginx、Redis以及TCP/UDP负载均衡的整合。下面将详细解释这些技术及其在实际应用中的作用。 ...
本教程将引导你通过"jdk+tomcat+nginx+redis+session共享"的全过程,搭建一套高效且可靠的服务器架构。我们将详细介绍每个组件的作用,配置步骤,以及如何实现session共享和负载均衡。 首先,我们从JDK(Java ...
本文将详细介绍如何使用`nginx`、`Tomcat`和`Redis`来实现负载均衡和跨服务器的session共享,以及在这个过程中可能涉及的依赖jar包。 首先,`nginx`是一个高性能的反向代理服务器和负载均衡器,它可以通过将来自...
标题提到的"nginx+springboot+dubbo +redis session共享"就是一个典型的微服务架构方案,它涉及到前端代理、后端服务化、分布式会话管理和缓存等多个关键环节。下面将详细阐述这些技术及其相互作用。 1. **Nginx**...
这个实例“tomcat+nginx+redis 实现sessionId共享”旨在教你如何在使用Tomcat作为应用服务器、Nginx作为反向代理服务器的环境中,利用Redis来实现跨服务器的会话(sessionId)共享。这对于在分布式系统中保持用户...