切断Spring-Session会话
首先
你有没有想过要从外部断开特定的Web应用程序会话?
就像发现了一个危险的家伙!先断开它吧。
而且不需要对Web应用程序进行任何更改…
目标是使用Spring-Session的Web应用程序,将会话保存在Redis中。
那么我考虑的就是简单地从Redis中删除会话信息。
我将尝试一下看能否成功。
如果有更聪明的方法,请指出来,我将不胜感激。
限制事项等
我们已经在以下环境中验证了本文所述内容。
-
- java version “11.0.7” 2020-04-14 LTS
-
- Docker Desktop 2.2.0.5
-
- Windows 10 + MINGW32(git-bash)
- (Macでも動作確認中 多分動くと思います)
准备Redis
准备Redis非常容易使用Docker。我们使用了这个方法创建了一个Redis环境。
$ docker-compose up -d
所以,我会启动Redis。
当然可以直接在使用的操作系统上安装Redis。
准备Spring-Session应用程序。
如果没有Spring-Session应用程序,就无法进行实验,但是找不到一个好的简单示例应用程序。所以我制作了一个简单的应用程序并放置在下面。
Spring-Session-Sample的运行方式
1. 在下载或克隆的目录中运行该应用程序。
$ ./gradlew bootRun
如果成功连接到Redis的默认端口(6379),并且成功启动。
在XXXX秒内启动了SSSApplication。
2. 访问 http://localhost:8080/
观察和操作Redis
观察Redis中注册的哪些项目用于管理会话。
- redis-cliの利用
$ docker exec -it [CONTAINER ID] /bin/bash
root@[CONTAINER ID]:/data# redis-cli
127.0.0.1:6379> (ココにコマンド入力)
请在docker ps命令中确认容器ID。
首先清除Redis。
127.0.0.1:6379> flushall
当访问 http://localhost:8080/ 并查看 Redis 时…
127.0.0.1:6379> keys *
1) "spring:session:sessions:0b288446-d209-4ecc-bfc4-7adf405e68a7"
2) "spring:session:sessions:expires:0b288446-d209-4ecc-bfc4-7adf405e68a7"
3) "spring:session:expirations:1604421420000"
有三个项目可以确认。
实际上,保持信息的是0b288446-d209-4ecc-bfc4-7adf405e68a7的HttpSession的会话ID。
1) "spring:session:sessions:0b288446-d209-4ecc-bfc4-7adf405e68a7"`
如果删除了上述项目,会话将会失效!
来试试看
请访问http://localhost:8080/
2. 确认Redis并删除会话。
127.0.0.1:6379> keys *
1) "spring:session:sessions:0b288446-d209-4ecc-bfc4-7adf405e68a7"
2) "spring:session:sessions:expires:0b288446-d209-4ecc-bfc4-7adf405e68a7"
3) "spring:session:expirations:1604421420000"
セッション情報を削除
127.0.0.1:6379> del spring:session:sessions:0b288446-d209-4ecc-bfc4-7adf405e68a7
(integer) 1
127.0.0.1:6379> keys *
1) "spring:session:sessions:expires:0b288446-d209-4ecc-bfc4-7adf405e68a7"
2) "spring:session:expirations:1604421420000"
按下[下一個]按鈕試試看
我已强制断开会话。还剩2个项目。
127.0.0.1:6379> keys *
1) "spring:session:sessions:expires:0b288446-d209-4ecc-bfc4-7adf405e68a7"
2) "spring:session:expirations:1604421420000"
有关于TTL(存续时间)已经设定好了,所以暂时可以放置不管。