背景
前后端分离,重理登录响应逻辑
问题
分离前的逻辑是,通过 spring security 校验每一次请求的授权,并且对于 未登录 和 权限不足 两种情况,又分别根据不同的请求类型做了两种响应
- 对于普通请求,会重定向至登录页
- 对于ajax请求,会返回一个 json 响应
当然现在前后端分离后端分离,后端的重定向肯定不能要,但是这个响应码看起来没问题
只是这儿有个逻辑判断
String xRequestedWith = request.getHeader("x-requested-with");
if ("XMLHttpRequest".equals(xRequestedWith)) {
response.setContentType("application/plain;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(CommunityUtil.getJSONString(403, "你还没有登录哦!"));
} else response.sendRedirect(request.getContextPath() + "/login");
就是说必须要是 XHR 形式的请求,众所周知,ajax 是对 XHR 的封装,axios 也是
按理说没问题吧,但偏偏就获取不到了
设置跨域过滤器设置
response.addHeader("Access-Control-Expose-Headers","myHeader");
同时又发现 Spring Security 的拦截要早于我自己设置的跨域浏览器
继续
采用 Spring Security 自带的 CORS 支持却并没有生效
发现很奇怪的点就是,当我设置了两个自定义请求头
headers:{
'X-Requested-With': 'XMLHttpRequest',
'aaaa':"cccccccccccccccccccccccc"
}
X-Requested-With
可以正常接收,而aaaa
则会触发预检请求
我真的是搞不懂
结果
解决方案是调整自定义 Filter 的执行位置在 Spring Security 之前
.and()
.addFilterBefore(new CorsFilter(), ChannelProcessingFilter.class)
悬而未决的问题
- 不知道为什么设置的 Spring Security Cors 方案没有生效
- 似乎并不能保证除了
X-Requested-With
字段外其他自定义头字段的正常接收