单点登录demo
2017-11-08 本文已影响0人
eblly
环境要求
redis
java 1.8
springMVC
tomcat
前奏
单点登录大致有两种方式,一是在tomcat配置session共享,二是使用共享存储。tomcat本身的session复制功能并不好用,官方文档也说明这种方式只适合小集群。共享存储的方式很多,例如存放到缓存、文本、数据库等等,但更普遍的方式是使用redis。
因此这里我们采用的方式是使用redis作为共享存储的媒介。示意图如下:
图1-1
使用docker 运行redis服务。
docker pull redis:3.2 #下载redis镜像
docker run --name redis01 -p 6379:6379 -d redis:3.2
命令解析
- --name redis01 #设置容器名称
- -p 6379:6379 #映射主机6379到容器6379端口
如果你自行安装redis也是可以,这里为了快速就直接使用docker。
放代码,挺住。
// 首页
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(@CookieValue(value = "token", defaultValue = "-1") String token, ModelMap map) {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest req = attr.getRequest();
map.put("ip", req.getServerName());
map.put("port", req.getServerPort());
map.put("token", token);
log.info("==>token: {}", token);
if ("-1".equals(token)) {
return "login";
}
List<String> tokenList = jedis.lrange("token", 0, -1);
if (tokenList.contains(token)) {
return "index";
} else {
return "login";
}
}
上述代码中, List<String> tokenList = jedis.lrange("token", 0, -1)
从redis获取所有的有效token,然后判断当前token是否存在redis的token当中,若有则进入首页,否则跳到登录页面。
流程图如下:
image.png
探入
将项目部署至两个tomcat中,端口分别为8080和9090。效果如下:
图1-2
先在8080端口的这个服务上测试效果。
图1-3
因为我们的认证是否登录的凭证是token,在这里的jsessionid并无任何用处。点击登录按钮后。跳转到首页。
图1-4
同时可以在cookie中发现有token的存在。
image.png
再次访问127.0.0.1:8080会直接进入到首页页面。
深入
当我们首次访问127.0.0.1:9090时,看到的是登录页面。将8080端口的token复制添加到9090的cookie中。
image.png
再请求127.0.0.1:9090则直接进入到首页。
image.png
至此,演示结束。
说明
在实际中,会用域名代替我们上面使用的127.0.0.1:8080
和127.0.0.1:9090
。浏览器遇到同一个域名会将cookie全部追加请求头中,并不需要我们手动添加cookie这一步骤。