Spring-SpringSession 介绍和使用

一、 HttpSession 回顾

什么是 HttpSession
是 JavaWeb 服务端提供的用来建立与客户端会话状态的对象。

二、 Session 共享

什么是 Session 共享

是指在一个浏览器访问多个 Web 服务时,服务端的 Session 数据需要共享。

Session 共享应用场景

List item单点登录
Web 服务器集群等场景

Session 共享常见的解决方案

Session 复制
通过对应用服务器的配置开启服务器的 Session 复制功能,在集群中的几台服务器之间同步 Session 对象,使得每台服务器上都保存所有的 Session 信息,这样任何一台宕机都不会导致 Session 的数据丢失,服务器使用 Session 时,直接从本地获取。这种方式的缺点也比较明显。因为 Session 需要时时同步,并且同步过程是有应用服务器来完成,由此对服务器的性能损耗也比较大。

Session 绑定
利用 hash 算法,比如 nginx 的 ip_hash,使得同一个 Ip 的请求分发到同一台服务器上。 这种方式不符合对系统的高可用要求,因为一旦某台服务器宕机,那么该机器上的 Session 也就不复存在了,用户请求切换到其他机器后么有 Session,无法完成业务处理。

利用 Cookie 记录 Session
Session 记录在客户端,每次请求服务器的时候,将 Session 放在请求中发送给服务器, 服务器处理完请求后再将修改后的 Session 响应给客户端。这里的客户端就是 cookie。 利用 cookie 记录 Session 的也有缺点,比如受 cookie 大小的限制,能记录的信息有限, 安全性低,每次请求响应都需要传递 cookie,影响性能,如果用户关闭 cookie,访问就不正常。

Session 服务器
Session 服务器可以解决上面的所有的问题,利用独立部署的 Session 服务器统一管理 Session,服务器每次读写 Session 时,都访问 Session 服务器。 对于 Session 服务器,我们可以使用 Redis 或者 MongoDB 等内存数据库来保存 Session 中的数据,以此替换掉服务中的 HttpSession。达到 Session 共享的效果。

三、SpringSession的简介

Spring Session 是 Spring 的项目之一。Spring Session 提供了一套创建和管理 Servlet HttpSession 的方案,默认采用外置的 Redis 来存储 Session 数据,以此来解决 Session 共享的 问题。

四、集成SpringSession

1、传统项目继承

Maven中pom.xml文件中添加(选一种添加上就行):

<span style="white-space:pre">    </span><!--1、redis-整合--> 
    <dependency> 
      <groupId>org.springframework.session</groupId> 
      <artifactId>spring-session-data-redis</artifactId> 
      <version>1.0.2.RELEASE</version> 
    </dependency> 
    <!-- 2、Redis --> 
    <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-redis</artifactId> 
      <version>1.4.2.RELEASE</version> 
    </dependency>    
    <dependency> 
      <groupId>redis.clients</groupId> 
      <artifactId>jedis</artifactId> 
      <version>2.5.2</version> 
    </dependency> 
    <dependency> 
        <groupId>org.springframework.session</groupId> 
        <artifactId>spring-session</artifactId> 
        <version>1.0.2.RELEASE</version> 
    </dependency> 
    <dependency> 
       <groupId>org.apache.commons</groupId> 
       <artifactId>commons-pool2</artifactId> 
       <version>2.2</version> 
    </dependency>

在spring配置文件(applicationContext.xml)中添加代码:

<span style="white-space:pre">  </span><!-- 自动扫描 --> 
   <context:annotation-config/> 
  <!-- 配置spring-session -->  
  <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">  
    <!-- 过期时间100分钟 --> 
    <property name="maxInactiveIntervalInSeconds" value="6000"></property> 
  </bean>  
  <!-- redis连接池 --> 
  <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" />  
  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >  
    <property name="hostName" value="10.4.120.180" />  
    <property name="port" value="6379" />  
    <property name="poolConfig" ref="jedisPoolConfig" />  
  </bean>

在web.xml中添加过滤即可:

<span style="white-space:pre">  </span><!-- Spring Session的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>/* 
   
   
    30 
    

这样就自动将session放入到reids库中了。

Sringboot项目集成SpringSessoin

1. pom.xml中引入jar包

<!-- Spring Boot Redis 依赖 -->
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>  
  <dependency> 
    <groupId>org.springframework.session</groupId> 
    <artifactId>spring-session-data-redis</artifactId> 
 </dependency>   
 <dependency>
   <groupId>org.springframework.session</groupId>
   <artifactId>spring-session-core</artifactId>
 </dependency>

添加RedisSessionConfig配置类
在项目的目录中,创建一个java文件(名称随意)即可,我这里名称是RedisSessionConfig.java
@EnableRedisHttpSession这个注解非常最重要,加了它之后,会使用spring的一个拦截器来实现Session共享的操作,而配置的这个Bean,则是让Spring根据配置文件中的配置连到Redis。
SpringSession 需要注意的就是redis需要2.8以上版本,然后开启事件通知,在redis配置文件里面加上

notify-keyspace-events Ex // 打开此配置,其中Ex表示键事件通知里面的key过期事件,每当有过期键被删除时,会发送通知

或是使用如下命令开启开启事件通知:

redis-cli config set notify-keyspace-events Egx

如果你的Redis不是你自己维护的,比如你是使用阿里云的Redis数据库(我就是这种情况),你不能够更改它的配置,那么可以使用下面的java配置文件即可。

package org.spring.springboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.ConfigureRedisAction;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
// maxInactiveIntervalInSeconds 默认是1800秒过期,这里测试修改为60秒
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class RedisSessionConfig { 
 @Bean
 public static ConfigureRedisAction configureRedisAction() {
 return ConfigureRedisAction.NO_OP;
 }
}

3. 配置redis连接

Spring Boot会自动创建一个RedisConnectionFactory将Spring Session连接到端口6379(默认端口)上localhost上的Redis服务器的连接。在生产环境中,您需要确保更新配置以指向Redis服务器

src/main/resources/application.properties

# Redis 配置
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=1234

Spring-SpringSession 介绍和使用_第1张图片

你可能感兴趣的:(【Spring】)