前言
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是一样的。