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字段外其他自定义头字段的正常接收
posted @ 2023-02-20 01:37  YaosGHC  阅读(74)  评论(0)    收藏  举报