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)

悬而未决的问题

  1. 不知道为什么设置的 Spring Security Cors 方案没有生效
  2. 似乎并不能保证除了X-Requested-With字段外其他自定义头字段的正常接收

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/17136053.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(55)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起