前言

1.概念:

  • Session,也就是会话的意思。是对每个访问者生成的唯一标识,对不同的访问者将会生成不同的Session。
  • Session在应用的Servlet容器中生成,保存在内存中。
  • Session是有一个有效期的。
  • 举个例子:当你用浏览器去请求一个服务时,该服务器会在Servlet容器中対该浏览器生成一个唯一的Session。之后该浏览器继续去请求,服务器拿到的Session会是同一个。如果关闭浏览器重开,或者另开浏览器再去请求,那么服务器会生成不同的Session,因为是不同的访问者了。但是如果等到Session过期,那么下次访问就会重新生成Session。

2.应用场景:

  • 需求是用户在A系统登录后,便可进入B系统的页面,若用户未在A系统登录则无法进入B系统。并且要防止他人在知道用户已经登录A系统的情况下另开一台电脑直接进入B系统,此时需要使用Session来区分访问者,但也需要两个系统共享共享同一个用户的Session。
  • 使用负载均衡的分布式系统。同一个用户的http请求会被分发到不同的应用上,然后在每个应用各自的Servlet容器里生成不同的session,这样显然是有问题的。这种情况下需要多个应用共享同一个用户的Session,形成一个整体的集群,在访问者看来这就是一个系统。
  • 上面提到过Session在应用的Servlet容器中生成,保存在内存中。这意味着Servlet容器一旦停止服务,那么Session也随之消失;但如果Session被保存到Redis中,只要Redis服务没停且Session在有效期间内,那么Servlet容器停止服务了,Session还是存在的,这有什么好处了,好处就是Servlet容器出现闪停闪修复的情况,用户就不用重新登录了。

如何实现

1.安装Redis服务并运行
Windows:

下载Redis-x64-xxx.zip压缩包并解压,打开命令行,切换到解压后的Redis目录,运行:

redis-server.exe redis.windows.conf

这种方式表示使用指定配置。后面的redis.windows.conf表示指定使用这个文件的配置

redis-server.exe

也可以像这样可以省略,省略则是使用默认的。

另外还可以直接双击Redis目录里的redis-server.exe运行。

Linux:

本教程使用的最新文档版本为 2.8.17,下载并安装:

$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make

make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下。下面启动redis服务。

$ cd src
$ ./redis-server

注意这种方式启动redis使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。

$ cd src
$ ./redis-server ../redis.conf

redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

Ubuntu:

在 Ubuntu 系统安装 Redis 可以使用以下命令:

$sudo apt-get update
$sudo apt-get install redis-server

启动 Redis:

$ redis-server

查看 redis 是否启动:

$ redis-cli
2.在pom.xml中添加maven依赖:
<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>
3.创建配置类:
@EnableRedisHttpSession
@Configuration
public class RedisSessionConfig {
}

在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持。

@EnableRedisHttpSession这个注解是由spring-session-data-redis提供的,也就是上一步添加的依赖。

4.在application.properties中配置spring session以及redis服务器的参数
# Spring Session相关配置
spring.session.store-type=redis	
server.servlet.session.timeout=1800000   #session有效时间
spring.session.redis.flush-mode=on_save   #redis刷新模式 有2种:immediate/on_save
spring.session.redis.namespace=spring:session
# Redis相关配置
spring.redis.host=localhost   #这里我们以本地为例。实际视具体情况而定
spring.redis.port=6379
5.定义Controller以及测试

完成上面4个步骤之后,一个最简单的spring boot + redis实现session共享就已经完成了。

定义一个测试接口将SessionID打印出来,如下:

@GetMapping("/test")
public void test(HttpServletRequest request){
    HttpSession session = request.getSession();
    System.out.println("Session Id:"+session.getId());
}

然后用该项目开启两个端口不同的服务,用同一个浏览器分别访问两个服务的测试接口,可以看到两个服务里管理的该浏览器的SessionID是一样的。