1.什么是跨域?
跨域(CORS)是指不同域名之间相互访问。是指浏览器不能访问其他网站的脚本,它是由浏览器的同源策略造成的,同源策略是浏览器对于JavaScript所定义的安全限制策略。
由于现在在开发中大多数都是前后端分离的项目,所以会导致跨域问题,下面我们先了解跨域再解决跨域问题。
同源策略:是指协议,域名,端口都要相同,其中有一个不同就会产生跨域问题。
2.什么情况下会遇到跨域问题呢?
如果不是同一协议、同一IP地址、同一端口号,这三个条件如果有一个不满足就会产生跨域问题。
当协议、IP地址和端口号相同时,就可以访问不同的文件。
3.跨域的流程
参考地址:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
要想实现跨域,浏览器要先发出预检请求,等到服务器同意预检请求,然后才能发生真实请求。
4.解决跨域问题
在网关中定义一个类,该类用来过滤。
代码如下:
package com.dream.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 配置过滤器,解决跨域问题
*/
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig(){
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");//允许任何域名使用
corsConfiguration.addAllowedHeader("*");//允许任何头
corsConfiguration.addAllowedMethod("*");//允许任何方法(post、get等)
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter(){
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**",buildConfig());
//向Spring容器中注入一个过滤器
return new CorsFilter(source);
}
}
配置:
属性 | 说明 |
---|---|
Access-Control-Allow-Origin: | 支持哪些来源的请求跨域 |
Access-Control-Allow-Methods: | 支持哪些方法跨域 |
Access-Control-Allow-Credentials: | 跨域请求默认不包含cookie,设置为true就可以包含cookie |
Access-Control-Expose-Headers: | 跨域请求暴露的字段。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里边指定 |
Access-Control-Max-Age: | 表明该响应的有效时间为多少秒。在有效时间内,浏览器无须为同一请求再次发起预检请求。请注意,浏览器自身维护了一个最大有效时间,如果该首部字段的值超过了最大有效时间,将不会生效 |