jwt 单点退出问题解决方案之一
jwt简述
1、首先jwt是无状态登录,所以我们控制它的失效时间,从它被创建出来,就已经规定死了,它能存活多久
寻找解决方案的历程
最近项目需要使用单点登录技术,搞好之后,发现单点退出有问题,然后又是各种逛技术论坛啊,但是得到的最多的是,jwt官网已经说明,要让jwt失效很难,也违背了它设计的初衷,所以可以说根本没有比较好的解决方案,有的说用reids来存储,但是另外的几个项目非我公司的,并不能统一调度,所以这一个方案被废弃了,还有说用token黑名单,但那也只是一个概念性的东西,具体没找大代码的落地,白白高兴一场,最后还是瞎猫碰死耗子,我发现把cookie清空就实现退出功能,然后就编写相关代码,最后发现真的可以实现,
解决方案
1、首先在spring boot配置文件进行cookie的相关配置cookie的名字和path(path要和其他的项目保持一致,否则到时候无法获取其他path下的cookie)
server: port: 8084 servlet: context-path: /client2 session: cookie: name: client2 path: /
2、编写让cookie失效的代码
@RequestMapping("/exit") public void exit(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { final Cookie[] cookies = httpServletRequest.getCookies(); for (Cookie cookie : cookies) { //让所有的cookie失效 System.out.println(cookie.getName()); cookie.setMaxAge(-1); cookie.setValue(null); cookie.setPath("/"); httpServletResponse.addCookie(cookie); } //跳转到登录界面 httpServletResponse.sendRedirect("http://localhost:8082/uaa/authentication/require"); }
这个解决方案还是有bug的,比如两个不同的浏览器等,希望有更好的解决方案,可以提出来