帮后端问的,跨域请求头加上去了,但是为什么无效

75 天前
 xiaohantx

java 部分的代码

@Configuration
@EnableWebMvc
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        log.info("Adding CORS mappings");
        registry.addMapping("/**") // 推荐限定路径前缀,而不是 /**
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .exposedHeaders("Authorization", "Link", "X-Total-Count")
                .allowCredentials(false)
                .maxAge(3600);
    }
}@CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.OPTIONS})
@RestController
@RequestMapping("/count")
public class LaborHourCountController {

我还试了显示的处理 options 请求

@Slf4j
@RestController
@CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.OPTIONS})
@RequestMapping("/laborOrder")
public class LaborOrderController {

    @Resource
    private LaborOrderService laborOrderService;

    /**
    * 查询工时工单列表
    * */
    @PostMapping(value = "/getLaborOrder/list")
    public Result getLaborOrderList(@RequestBody LaborOrderVo laborOrderVo){
        PageResult<LaborOrder> laborOrderList = laborOrderService.listByVo(laborOrderVo);
        return Result.success(laborOrderList);
    }

    // 显式处理 OPTIONS 请求
    @RequestMapping(value = "/getLaborOrder/list", method = RequestMethod.OPTIONS)
    public ResponseEntity<?> handleOptions() {
        return ResponseEntity.ok()
                .header("Access-Control-Allow-Origin", "*")
                .header("Access-Control-Allow-Methods", "POST")
                .header("Access-Control-Allow-Headers", "Content-Type")
                .build();
    }


} 

仍然浏览器显示

Access to XMLHttpRequest at 'http://xxx:8085/laborOrder/getLaborOrder/list' from origin 'http://xxxx:5173' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
2068 次点击
所在节点    问与答
25 条回复
199808lanlan1111
75 天前
刚遇到同个问题 allowedOrigins 不支持配置*,看是否能配置 config.addAllowedOriginPattern ,这个支持*,我是不能配置后者,重写了 config 判断*的逻辑
unco020511
75 天前
Aolose
75 天前
不了解 java 但是我觉得预检请求 应该允许 option 而不是只是 post
另外非 bug 预检一般会返回 204 这个 ResponseEntity.ok() 是不是默认 200 ?(当然这不影响啥

@RequestMapping(value = "/getLaborOrder/list", method = RequestMethod.OPTIONS)
public ResponseEntity<?> handleOptions() {
return ResponseEntity.ok()
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "POST")
.header("Access-Control-Allow-Headers", "Content-Type")
.build();
}
Al0rid4l
75 天前
你最好是把请求报文和响应报文贴出来(浏览器, 或者抓包代理), 而不是贴请求工具的截图, 只有一点点信息让人搁这猜, 很累的. 查 CORS 问题最好的办法就是贴原始报文而不是贴代码

然后, 假设你图里都是响应报文, 那肉眼可见的问题有

Access-Control-Allow-Methods 只允许了 POST 而没有 OPTIONS, 虽然看你 Java 代码里有 allowedMethods 给了 OPTIONS, 但也不知道有没有执行到这里或者有其他中间件提前响应或覆盖响应头, 这个要后端去查. 你说添加了还是不行, 至少从你第二张图看来, 它没生效呀...没看出来添加了个啥

请求里有个 Authorization 头, 但响应头 Access-Control-Request-Headers 又只有 Content-Type, 虽然 Java 代码里的设置也是 allowedHeaders("*"), 但还是上面一样的问题, 反正最终响应只有 Content-Type 而没有允许 Authorization

另外还不知道前端请求有没有设置 withCredentials, 如果有的话, 后端配置 Access-Control-Allow-Origin 是不能用*的

还有这个 login 接口是个 GET, auth 还在 URL, 所以是个简单请求就过去了, 不过也挺抽象的...
zpfhbyx
74 天前
* 不是*,*

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1142802

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX