最近在写一个 demo,是前后端分离的,前端通过使用 axios 来发送异步请求来获取后端的数据,后端使用了 SpringSecurity 来做系统的鉴权,但发现,SpringSecurity 总是拿不到 session 的问题。
前言:
由于 SpringSecurity 中,很多东西都是基于 session 来做的,比如,当用户登录成功后,会创建一个 SecurityContextHolder,里面存储了用户认证后的 token 数据,然后将其存储到 session 中。
当该用户的后续请求再过来时,如用户的权限鉴定,会先到 session 中把该 SecurityContextHolder 取出来,这样就不需要重复的到数据库中查询用户的数据。
问题:
axios 在发送异步请求是,无法携带 sessionid,导致后端在处理请求时,会为其创建新的的会话,所以在用户登录成功后,在下一次请求,(访问带权限的 url) 做用户鉴权时就无法获取到用户的认证信息,这样 SpringSecurity 就会提示用户未登录,访问无权限的限定的 url 是,会看到用户的角色是 “匿名的”。
解决:
想要解决这个问题也很简单,思路就是然 axios 每次发送请求时,都带上 session_id,这样后端就可以识别出这是哪个 session。
axios 的设置:
将 withCredentials 设置为 true,默认为 false。意思是允许请求时携带 cookic 信息。
因为 http 是无状态的,所以 session 信息会存放在 cookic 中,随请求携带。
CORS 跨域设置
这里主要注意两个点:
1.Origin 不能使用通配符 ”*”
2.Credentials 要设置为 true
这里以 SpringSecurity 配置 CORS 为例