spring session通过redis存储,实现session共享

目录

前言

1 准备工作

1.1 spring框架的jar包

1.2 spring session的相关jar包

2 具体步骤

2.1 创建项目

2.2 spring mvc的配置

2.3 spring session的配置

2.4 web.xml的配置

3 测试

3.1 创建jsp测试文件

3.2 开始测试


前言

web开发中session一直都是做分布式集群应用时需要解决的一个难题,前面写了tomcat服务器集群的文章,那么集群中怎么实现session共享呢?

让我们回顾一下,Tomcat集群搭建(APACHE+MOD_JK+TOMCAT配置)的session共享是直接通过tomcat自带的复制功能,即访问其中一台tomcat服务器就会在其他配置好的tomcat服务器上各复制一份session,这样的session共享可能会存在一定的延迟,同时若并发量一大的话也会有网络风暴的风险;而Tomcat集群搭建(nginx+tomcat+redis)的session共享是通过第三方redis来存储session来实现的,这种方式以前比较流行,但是这种也是需要依赖于tomcat(需要修改tomcat的context.xml的配置),而且现在官方也没去更新tomcat-redis-session-manager的jar包了(仍然停留在支持tomcat7上,一些自己修改的jar包除外)。

本文我要说的session共享,就是独立于servlet容器、session存储在第三方存储容器redis的spring session。它不用担心并发量大时的网络风暴;不用担心换容器运行时,又需要各种各样的配置;不用担心servlet容器(即这里的tomcat)停止服务了,session就不存在了,用户又得重新登陆的麻烦。因为spring session的实现是在项目的配置,以及代码中的。

在开始之前,让我们先了解一下spring session实现session共享,以及在spring框架中实现的原理。

spring session通过redis来实现多个服务器间的session共享的原理,其实就是将session独立出来不依赖原来的web容器,而是存放到与web容器没有耦合关系的redis容器中,这样即使是任何一台web容器挂了,也不会影响到其中的session,如下图所示:

spring session在spring框架中的实现原理,其实就是在请求request上通过DelegatingFilterProxy代理过滤器封装了一层,将原来存储在容器缓存的session变成存储在redis的session,所以在web.xml中的此filter必须得是在所有filter的前面。具体的web容器加载过程,如下图所示:

1 准备工作

这里的准备工作有几点,redis存储容器、spring框架的jar包(需要在spring框架的环境下)和spring session的相关jar包。其中redis存储容器,我就不多说了,网上有很多redis的安装教程,或者参考此处redis的安装

1.1 spring框架的jar包

若你的项目原本就有spring框架的,忽略此准备工作。

注意:这里用的spring都是比较高版本的,最好用本文的相应版本,否则会出现一些版本不合的奇葩错误

commons-logging选择1.2版本:http://commons.apache.org/proper/commons-logging/download_logging.cgi

spring-aop选择5.0.8版本:http://www.mvnrepository.com/artifact/org.springframework/spring-aop

spring-beans选择5.0.8版本:http://mvnrepository.com/artifact/org.springframework/spring-beans

spring-context选择5.0.8版本:http://mvnrepository.com/artifact/org.springframework/spring-context

spring-core选择5.0.8版本:http://mvnrepository.com/artifact/org.springframework/spring-core

spring-expression选择5.0.8版本:http://mvnrepository.com/artifact/org.springframework/spring-expression

spring-web选择5.0.8版本:http://mvnrepository.com/artifact/org.springframework/spring-web

spring-webmvc选择5.0.8版本:http://www.mvnrepository.com/artifact/org.springframework/spring-webmvc

spring-tx选择5.0.8版本:http://mvnrepository.com/artifact/org.springframework/spring-tx

1.2 spring session的相关jar包

注意:这里用的spring session都是比较高版本的,最好用本文的相应版本,否则会出现一些版本不合的奇葩错误

commons-pool2选择2.6.0版本:http://commons.apache.org/proper/commons-pool/download_pool.cgi

jedis选择2.9.0版本:http://central.maven.org/maven2/redis/clients/jedis/

spring-data-commons选择2.0.9版本:https://repo.spring.io/libs-release/org/springframework/data/spring-data-commons/

spring-data-redis选择2.0.9版本:https://repo.spring.io/libs-release/org/springframework/data/spring-data-redis/

spring-session-core选择2.0.5版本:http://mvnrepository.com/artifact/org.springframework.session/spring-session-core

spring-session-data-redis选择2.0.5版本:https://repo.spring.io/libs-release/org/springframework/session/spring-session-data-redis/

2 具体步骤

2.1 创建项目

(1)在eclipse中创建一个web项目,命名为SpringSession。

(2)将上面下载的jar包全放到项目中WEB-INF/lib目录下。

2.2 spring mvc的配置

(1)在源码的src目录下创建config放置配置文件的包,以及创建com.sky.springsession放置java源码的包。

(2)在config包下创建applicationContext.xml文件,放置如下代码

<context:component-scan base-package=“com.sky.springsession”/>

context:annotation-config/

这是spring mvc的最基本的配置,当然这些配置在这里其实也是可以免去的。

2.3 spring session的配置

在config包下创建spring-session.xml文件,放置如下代码


注意,用了spring session后,在web.xml设置的session过期时间是无效。因为此session已经不是原来的存储在容器缓存内的session了,而是被封装多了一层后存储在redis的session。

2.4 web.xml的配置

在web.xml文件添加如下代码

contextConfigLocation classpath:config/\*.xml org.springframework.web.context.ContextLoaderListener springSessionRepositoryFilter org.springframework.web.filter.DelegatingFilterProxy springSessionRepositoryFilter /\* springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:config/applicationContext.xml 1 springmvc /

配置至此,就能够实现spring session通过存储到redis的session共享了。

3 测试

3.1 创建jsp测试文件

(1)在WebContent目录下创建index.jsp,放置如下代码

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ page import=“java.util.Date” %>

spring session <% System.out.println(new Date()+"=============tomcat1================="); session.setAttribute("tomcat1", "I am tomcat1"); %>

hello world!


<%=session.getId()%>======<%=new Date()%>

tomcat1======<%=session.getAttribute("tomcat1")%>

tomcat2======<%=session.getAttribute("tomcat2")%>

(2)在WebContent目录下创建result.jsp,放置如下代码

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ page import=“java.util.Date” %>

spring session

result tomcat1


<%=session.getId()%>======<%=new Date()%>

tomcat1======<%=session.getAttribute("tomcat1")%>

tomcat2======<%=session.getAttribute("tomcat2")%>

3.2 开始测试

(1)打开浏览器,输入url:http://localhost:8080/SpringSession/

(2)打开第二个标签页

(3)待30秒过后,刷新第二个标签页,发现tomcat1已经为null,说明上面的spring session的过期时间设置是有效的。

(4)当然想要看下spring session是否真的存在了redis,也可以到redis客户端上查看。

在这里插入图片描述
在这里插入图片描述

博主介绍:上海交大毕业,大厂资深Java后端工程师,
《Java全套学习资料》作者,
专注于系统架构设计和高并发解决方案
阿里云开发社区乘风者计划专家博主,
CSDN平台Java领域优质创作者
分享Java技术干货、项目实战经验,
并为大学生和初学者提供项目实战与就业指导

擅长:分布式系统、SpringCloud、SpringBoot、Vue、MySQL、Redis、Docker等项目开发和设计

/**
 * @author[vx] vip1024p(备注java)
 * @【描述:浏览器打开】docs.qq.com/doc/DUkVoZHlPeElNY0Rw
 */
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello!!!");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值