环境
SpringBoot + SpringSecurity + 前后端分离 (前端 127.0.0.1:8848,后端 localhost:8998)
问题
登录和其他请求的JSESSIONID(存入cookie内)不同,导致其他请求给后端的JSESSIONID为未登录的无效SESSIONID,提示未登录。
测试
A测试
顺序:登录(/login) ---> 组织结构(/depts) ---> 个人信息(/staff/getOne/wld)
登录:响应Cookie
组织结构:响应Cookie
个人信息:请求Cookie
后端
B测试
顺序:登录(/login) ---> 个人信息(/staff/getOne/wld) ---> 组织结构(/depts)
登录:响应Cookie
个人信息:无Cookie
组织结构:响应Cookie
后端
归纳
A、B两次的测试登录和其他的操作Cookie都不同,说明后端响应请求成功,但响应JSESSIONID并没有存入到本地,以致后序的操作拿不到Cookie中的JSESSIONID,能获取后端传来JSESSIONID的拿到了一个新的JSESSIONID(A中组织结构),不能获取后端传来JSESSIONID的也没有请求Cookie(B中个人信息)。
解决方案
开启withCredentials后,服务器才能拿到你的cookie。当然后端服务器也要设置允许你获取你开启了才有用(之前有设置)
前端开启
login.html(登录):没有开启
show-inform.html(个人信息):开启
struct-tree.html(组织结构):开启 (但是dataType没有指定,所以在A、B测试中其均有响应Cookie)
后端开启(所有请求都放行了withCredentials)
SpringSecurity中登录的过滤器
其他请求的过滤器
经验教训:
1、每次调试前,浏览器缓存、cookie啥的清除干净,方便查找问题
2、改动要完整,要清楚是干什么的(前端login.html没有开启withCredentials是这次的主要问题)