目录
- 一、SpringSession 简介
- 二、入门案例
- 1. 环境配置
- 2. 代码开发
- 3. 部署测试
一、SpringSession 简介
Spring Session 是 Spring 家族中的一个子项目,它提供一组API和实现,用于管理用户的session 信息它把 servlet 容器实现的 HttpSession 替换为 spring-session,专注于解决 session管理问题,Session信息存储在Redis中,可简单快速且无缝的集成到我们的应用中。
Spring Session的特性 :
- 提供用户 session 管理的 API 和实现
- 提供HttpSession,以中立的方式取代 web 容器的 session,比如 tomcat 中的 session
- 支持集群的 session 处理,不必绑定到具体的 web 容器解决集群下的session共享问题
二、入门案例
1. 环境配置
创建一个空的 project,名字及路径根据自己的情况定。
空 project 创建好后,会提示创建模块,我们暂时先取消。
之后我们来设置编码方式
设置 maven 信息
创建一个 Maven 的 web module,起名为 springsession-web
完善 Maven 项目的结构
向 pom.xml 文件中添加 servlet及jsp 的配置
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2. 代码开发
创建向 session 放数据的 servlet
● 在 java 目录下创建包 com.fancy.session.servlet 包
● 在 servle t包下创建 SetSessionServlet
● 在Servlet中通过注解指定 urlPatterns,并编写代码
创建从 session 放数据的 servlet
● 在servlet包下创建 GetSessionServlet
● 在Servlet中通过注解指定urlPatterns,并编写代码
部署访问测试,目前无法实现session共享
● 配置 tomcat 9100 服务器
修改端口号
将项目部署到 tomcat 9100上
实现热部署
● 配置 tomcat 9200 服务器
操作同配置 tomcat 9100
SpringSession集成配置
● 在pom.xml文件中,添加Spring Session相关的依赖
<!-- Spring session redis 依赖 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<!-- spring web模块依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
● 在 web.xml 文件中配置 springSessionRepositoryFilter 过滤器
<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>
● 在 web.xml 文件中加载 Spring 配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath: application.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
● 创建 applicationContext-session.xml
A、配置一个 RedisHttpSessionConfiguration 类
<!-- Spring注解、bean处理器 -->
<context:annotation-config></context:annotation-config>
<!-- Spring session 的配置类 -->
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
</bean>
<context:annotation-config/>
:
用于激活已经在Spring容器中注册的bean或者注解,因为我们通过容器创建的 bean 中,底层有可能使用了其它的注解,我们通过<context:component-scan>
就不能指定具体的包了,所以可以使用<context:annotation-config/>
激活
B、配置Spring-data-redis
<!-- 配置jedis连接工厂, 用于连接redis-->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.hostName}"></property>
<property name="port" value="${redis.port}"></property>
<property name="password" value="${redis.password}"></property>
<property name="usePool" value="${redis.usePool}"></property>
<property name="timeout" value="${redis.timeout}"></property>
</bean>
<!-- 读取redis.properties 属性配置文件-->
<context:property-placeholder location="classpath:redis.properties"></context:property-placeholder>
● 配置 redis.properties 文件
redis.hostName=192.168.160.133
redis.port=6379
redis.password=
redis.usePool=true
redis.timeout=15000
● 在 applicationContext.xml 中导入 applicationContext-session.xml
点击右上角的 config 将这两个配置文件进行关联
3. 部署测试
思路
为了演示session的共享,我们这里配置两个tomcat服务器,端口号分别为 9100 和 9200,将我们上面创建好的项目分别部署到这两台服务器上。一台服务器执行放session,另一台服务器执行取session的操作。
启动Linux上的redis服务器
启动两台 tomcat 服务器
如连接不上Redis ,修改 redis.conf 以下配置
再在文件最后新加一条属性
notify-keyspace-events
● 在浏览器中访问 tomcat9100 服务器的 setSession
分析
tomcat 9200 服务器上的项目可以访问 tomcat 9100 上的 session,说明 session 共享成功
进一步验证
打开 Redis 客户端工具 (RedisDesktopManager) ,查看Redis里面的session数据
其实标准的 redis 的 key 格式就是用冒号分割,客户端工具会以目录的形式展示