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

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.
2067 次点击
所在节点    问与答
25 条回复
klo424
75 天前
感觉问 AI 快一点
Ayanokouji
75 天前
adov
75 天前
看接口返回的响应标头
DOLLOR
75 天前
看 DevTools 的 Network 里的请求结果
xiaohantx
75 天前
@DOLLOR
Provisional headers are shown
Accept: application/json, text/plain, */*
Authorization: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiLlsLnmmZciLCJ1c2VySWQiOiIxNzEwOTA1MDQ5NTUyNiIsInBlcm1zIjpbXSwiYXZhdGFyIjoiaHR0cHM6Ly9zdGF0aWMtbGVnYWN5LmRpbmd0YSG1uMUFBXzcwN183MDcuanBnIiwidXNlck5hbWUiOiLlsLnmmZciLCJleHAiOjE3NTE1NDgzNDMsImlhdCI6MTc1MTUzMDM0M30.CeY0ER8LrElYGxMtYmz9DR_1jI84NRVh2Dq_FH3O_w5TQbhk8mJhIfrZIeor30YF7IURGzdUI8_ym6UNa_9Dcg
Content-Type: application/json
Referer: http://192.168.130.163:5173/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36 dingtalk-win/1.0.0 nw(0.14.7) DingTalk(7.0.20-RC.5169101) Mojo/1.0.0 Native AppType(rc) Channel/201200 Architecture/x86_64
Razio
75 天前
月经贴之不会跨域的同事
SirYuxuan
75 天前
/**
* 处理跨域问题
*
* @return 跨域配置
*/
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOriginPattern("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}

试试这个呢
xiaohantx
75 天前
xiaohantx
75 天前
@adov 这是 postman 的
leokun
75 天前
在无痕模式下,应该可以看到一次 OPTIONS 请求(有缓存,并不是每次都会发)
这个 OPTIONS 需要满足
http 状态码需要 200
响应头需要包含 Access-Control-Allow-Origin * 和 Access-Control-Allow-Methods: *
leokun
75 天前
上面截图里面 OPTIONS 的响应头 Access-Control-Allow-Methods 只允许 post ,所以 OPTIONS 检查实际是失败了
lpe234
75 天前
5173 大概率 vite 。开发模式 直接配置 proxy 吧。其他环境用 nginx 代理就行。

xiaohantx
75 天前
@lpe234 这个开发模式前端去设置我知道,其实最大的是后端增加头但是说无效,所以我也不知道,我本地开 proxy 没啥用,因为打包后测试还是跨域
xiaohantx
75 天前
@DOLLOR
@adov
@Ayanokouji
@SirYuxuan
@leokun #11
有一个 login 接口反而没拦截下来

GET / 190:8085/login?authCode=28be5bbfd

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://192.168.130.163:5173
Connection: keep-alive
Content-Type: application/json
Date: Thu, 03 Jul 2025 09:10:01 GMT
Keep-Alive: timeout=4
Proxy-Connection: keep-alive
Transfer-Encoding: chunked
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
xiaohantx
75 天前
@leokun #11 https://meee.com.tw/9U30OJY
添加了似乎还是不行
swczxf
75 天前
是不是你后面请求头比 login 接口多
leokun
75 天前
@xiaohantx #14 添加错了
adov
75 天前
@xiaohantx 这个登录接口是简单请求,不会 cors 的
wxw752
75 天前
不会是在多个地方加了处理跨域的头吧,加多次等于没加
adov
75 天前
就是你后端的 Access-Control-Allow-Methods 没配置对,你看看 options 请求的返回,让后端配置到对为止

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

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

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

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

© 2021 V2EX