`
TableMiao
  • 浏览: 75301 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

nginx+spring-session+redis 实现session共享

阅读更多

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

     之前的sessiontomcat创建,现在交由Spring-session中的SessionRepository并保存到redis里。

 

  Req流转:

   1. Web.xml加载

   content-param --> listener --> filter

 

   2.加载spring监听之后 contextInitialized 方法执行 初始化根web应用程序上下文。

  

   3.初始化我们配置的各种bean,加载JedisConnectionFactory初始化

 

   4. 初始化我们配置的各种bean,进入到我们配置的RedisHttpSessionConfiguration

  

   5.点开RedisHttpSessionConfiguration 可以看到它里面创建了Nbean,主要的几个有springSessionRepositoryFilter(这是他父类里的)、sessionRedisTemplatesessionRepository ,由这3bean 实例化redistemple,设置保存的存储类型为Hash,而它的参数RedisConnectionFactory3JedisConnectionFactory提供

  

   6.filter拦截DelegatingFilterProxy 一看卧槽这是个代理,如果不指定init-param参数的话,DelegatingFilterProxy就会把filter-name作为要查找的Bean对象,这也是DelegatingFilterProxy类的作用。我们配置的是springSessionRepositoryFilter 这个东西再哪里呢?

 

   7.5步里面RedisHttpSessionConfiguration 初始化时会加载,它继承了OncePerRequestFilterOncePerRequestFilter又继承了filter,就是这个玩意替换了javax.servlet.http.HttpSession支持org.springframework.session.Session      

 

   8.点进去可以看到在OncePerRequestFilterdofilter里面加载了doFilterInternal方法,该方法被springSessionRepositoryFilter 自定义实现,除了包装了一套HttpServletRequestHttpServletRespouse ,在finally里执行了commitSession方法,这个方法里执行了save()方法,该方法保存session用,底层执行的是RedisOperationsSessionRepository ,到这里终于和redis扯上关系了,底层通过RedisTemplate 进行存储操作keysessionId value session对象放的是map

 

   9.session过期策略,定期job 每分钟一次执行上一分钟过期的keysessionid  方法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

 

 

  • 大小: 27.2 KB
  • 大小: 31.3 KB
分享到:
评论

相关推荐

    nginx+tomcat+redis完成session共享

    这个小例子"nginx+tomcat+redis完成session共享"旨在演示如何通过这三种技术实现跨服务器的用户会话共享,以提升用户体验并简化系统管理。以下是这些技术及其在会话共享中的作用: 1. **Nginx**:Nginx是一款高性能...

    springboot +shiro+redis实现session共享(方案二)1

    "Spring Boot + Shiro + Redis 实现 Session 共享方案二" 1. 概述 本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 ...

    nginx+tomcat7+jdk1.7+redis--jar.rar

    综上所述,"nginx+tomcat7+jdk1.7+redis--jar.rar"的解压内容用于搭建一个高效的Web服务架构,通过Nginx分发请求,利用Redis实现跨服务器的Session共享,提升系统的可扩展性和性能。在实际操作中,需要根据具体环境...

    ssm+redis+nginx实现session共享和负载均衡

    综上所述,结合SSM、Redis和Nginx,我们可以构建一个高可用、高性能的Web应用系统,实现session的跨服务器共享,并通过负载均衡策略确保服务的稳定性和可扩展性。在实际项目中,可以根据业务需求和资源状况,灵活...

    nginx+redis实现session共享

    在IT行业中,构建高效、可扩展的Web服务是至关重要的,而"nginx+redis实现session共享"的主题就涉及到了这一核心需求。为了实现单点登录(Single Sign-On, SSO)以及跨应用的session共享,我们可以结合使用Nginx作为...

    nginx+redis负载均衡、session共享

    在构建高性能、高可用的Web服务时,"nginx+redis负载均衡、session共享"是一个常见的解决方案。这个方案结合了Nginx的反向代理和负载均衡能力,以及Redis的内存数据存储和分布式特性,用于处理高并发场景下的HTTP...

    nginx+tomcat6+redis实现session共享Jar文件

    "nginx+tomcat6+redis实现session共享"是一个常见的解决方案,旨在提高系统的可扩展性和高可用性。这个配置允许多个Tomcat服务器之间共享用户session,避免了用户在切换服务器时需要重新登录的问题。下面将详细介绍...

    springboot+Nginx+redis实现session共享

    本教程将详细讲解如何利用Spring Boot、Nginx和Redis来实现高效的Session共享,以满足大规模并发场景下的会话管理需求。 **Spring Boot与Session管理** Spring Boot是基于Spring框架的快速开发工具,它简化了配置...

    Nginx+tomcat+redis

    - **session共享**:在分布式环境中,Redis可以作为session存储,解决跨服务器的session共享问题,确保用户会话的一致性。 - **消息队列**:Redis支持发布/订阅模型,可以作为简单消息队列,用于异步处理任务或...

    redis缓存服务器Nginx+Tomcat+redis+MySQL实现session会话共享

    "redis缓存服务器Nginx+Tomcat+redis+MySQL实现session会话共享"的主题旨在探讨如何利用这些技术组件来实现这一目标。以下是相关知识点的详细说明: **Redis**:Redis是一个高性能的键值数据存储系统,常用于做缓存...

    Spring Session + redis实现session共享

    Spring Session的核心思想是将session数据从传统的JVM内存中移出,存储到一个独立的数据存储系统,如Redis,这样可以实现session在多台服务器之间的共享。 Redis是一个高性能的键值数据库,常用于缓存和消息代理。...

    三、Nginx+Tomcat+Redis实现Session共享

    - `spring-session-data-redis`:Spring 提供的 `spring-session` 模块,用于集成Redis来实现Session共享。在`pom.xml`中添加对应的依赖。 - `redis.properties`:配置Redis的连接信息,如主机名、端口、密码等。 ...

    ssm+redis 实现session共享

    SSM+Redis 实现Session共享是现代Web应用中常见的技术组合,主要目的是在分布式系统中保持用户Session的一致性。SSM是指Spring、Spring MVC和MyBatis这三大Java Web开发框架的组合,而Redis则是一种高性能的键值存储...

    springboot-nginx-redis-session共享、TCPUDP负载均衡.zip

    本资料包“springboot-nginx-redis-session共享、TCPUDP负载均衡.zip”提供了一套完整的解决方案,涉及到Spring Boot、Nginx、Redis以及TCP/UDP负载均衡的整合。下面将详细解释这些技术及其在实际应用中的作用。 ...

    jdk+tomcat+nginx+redis+session共享从头搭建一套完整服务

    本教程将引导你通过"jdk+tomcat+nginx+redis+session共享"的全过程,搭建一套高效且可靠的服务器架构。我们将详细介绍每个组件的作用,配置步骤,以及如何实现session共享和负载均衡。 首先,我们从JDK(Java ...

    nginx-tomcat-redis负载均衡,session共享依赖jar包

    本文将详细介绍如何使用`nginx`、`Tomcat`和`Redis`来实现负载均衡和跨服务器的session共享,以及在这个过程中可能涉及的依赖jar包。 首先,`nginx`是一个高性能的反向代理服务器和负载均衡器,它可以通过将来自...

    nginx+springboot+dubbo +redis session共享

    标题提到的"nginx+springboot+dubbo +redis session共享"就是一个典型的微服务架构方案,它涉及到前端代理、后端服务化、分布式会话管理和缓存等多个关键环节。下面将详细阐述这些技术及其相互作用。 1. **Nginx**...

    tomcat+nginx+redis 实现sessionId共享 实例

    这个实例“tomcat+nginx+redis 实现sessionId共享”旨在教你如何在使用Tomcat作为应用服务器、Nginx作为反向代理服务器的环境中,利用Redis来实现跨服务器的会话(sessionId)共享。这对于在分布式系统中保持用户...

Global site tag (gtag.js) - Google Analytics