Cors 自定义请求头问题
背景
前后端分离,重理登录响应逻辑
问题
分离前的逻辑是,通过 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
字段外其他自定义头字段的正常接收
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/17136053.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步