A addCorsMappings

public void addCorsMappings(CorsRegistry registry) {
   
    registry.addMapping("/**")
            .allowedOrigins("*")
            .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
            .allowCredentials(true)
            .allowedHeaders("*")
            .maxAge(3600);
}

使用此方法配置之后再使用自定义拦截器时跨域相关配置就会失效。

原因是请求经过的先后顺序问题,当请求到来时会先进入拦截器中,而不是进入Mapping映射中,所以返回的头信息中并没有配置的跨域信息。浏览器就会报跨域异常。

B CorsFilter

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        //是否允许请求带有验证信息
        corsConfiguration.setAllowCredentials(true);
        // 允许访问的客户端域名
        corsConfiguration.addAllowedOriginPattern("*");
        // 允许服务端访问的客户端请求头
        corsConfiguration.addAllowedHeader("*");
        // 允许访问的方法名,GET POST等
        corsConfiguration.addAllowedMethod("*");
        // 最大时间
        corsConfiguration.setMaxAge(3600L);
        // 注册配置
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }

Sa-Token

前后端token方式,并不是使用的cookie,SpringBoot项目只需要设置一下禁止cookie传递,就可以了,也就是B CorsFilter 方案

解决跨域问题

使用 Sa-Token 的全局过滤器解决跨域问题(三种方式全版)

测试

随便找一个网站,打开F12控制台,用fetch发送请求

如何生成fetch,用apifox生成cur,让ai转也行

fetch("<http://127.0.0.1:8080/user/doLogin>", {
  "headers": {
    "accept": "*/*",
    "accept-language": "zh-CN,zh;q=0.9",
    "content-type": "application/json",
    "sec-ch-ua": "\\"Chromium\\";v=\\"134\\", \\"Not:A-Brand\\";v=\\"24\\", \\"Google Chrome\\";v=\\"134\\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\\"Windows\\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "cross-site"
  },
  "referrer": "<https://blog.csdn.net/Dream_Weave/article/details/106849575>",
  "referrerPolicy": "unsafe-url",
  "body": "{\\"username\\":\\"zhang\\"}",
  "method": "POST",
  "mode": "cors",
  "credentials": "omit"
});

资料

使用 addCorsMappings 配置跨域的坑