java后端解决跨域问题

一、问题来源

  最近同事开发一个功能,提供接口给第三方调用,第三方调用时直接前端进行调用的因此触发了跨域拦截,报错如下:

 二、解决方法

  可以要求第三方在自己后端做一个转发,前端调自己后端的接口,后端再去请求我们的接口,然后将数据返回给前端,也可以我们自己后端处理,增加CORS配置:

@Configuration
public class OriginConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("*");
        //是否发送Cookie信息
        config.setAllowCredentials(true);
        //放行哪些原始域(请求方式)
        config.addAllowedMethod("*");
        //放行哪些原始域(头部信息)
        config.addAllowedHeader("*");
        //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
        //config.addExposedHeader("*");

        //2.添加映射路径
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }
}

三、总结

  跨域问题出现在浏览器中,总的来说,浏览器只有在协议,主机,端口三者相同是,才可以互相访问,否则不可以访问,这就是浏览器的同源策略而造成跨域问题。跨域请求不通是因为:请求能正常发出去,后端也能正常响应,是浏览器把响应拦截了,所以才会出现报错 : has been blocked by CORS policy: Response to preflight request does not pass access control check。

  access-control-allow-origin :该字段是必须的,它的值要么是请求时 origin 字段的值,要么是一个 * ,表示接受任何域名的请求。
  access-control-allow-credentials :该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie 不包括在 CORS 请求之中,设为 true ,表示服务器明确许可,Cookie 可以包含在请求中,一起发送给服务器,这个值也只能设为true ,如果服务器不要浏览器发送 Cookie ,删除字段即可。
  Access-Control-Allow-Methods :该字段必须,他的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法,注意,返回的是所有支持的方法,而不是浏览器请求的那个方法,这是为了避免多次 “ 预检 ” 请求,其实最重要的是:access-control-allow-origin 字段,添加一个 * ,允许所有的域都能访问。

posted @ 2023-01-10 10:25  莫等、闲  阅读(918)  评论(0编辑  收藏  举报