一、问题来源
最近同事开发一个功能,提供接口给第三方调用,第三方调用时直接前端进行调用的因此触发了跨域拦截,报错如下:
二、解决方法
可以要求第三方在自己后端做一个转发,前端调自己后端的接口,后端再去请求我们的接口,然后将数据返回给前端,也可以我们自己后端处理,增加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 字段,添加一个 * ,允许所有的域都能访问。