-
什么是跨域?
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对 javascript 施加的安全限制。只要请求的协议、域名、端口号其中一个不同,则是跨域请求。
-
跨域请求流程
服务器允许跨域请求头:
- Access-Control-Allow-Origin:可接受的域,是一个具体域名或者*(代表任意域名)
- Access-Control-Allow-Credentials:是否允许携带cookie,默认情况下,cors不会携带cookie,除非这个值是true
- Access-Control-Allow-Methods:允许访问的方式
- Access-Control-Allow-Headers:允许携带的头
- Access-Control-Max-Age:本次许可的有效时长,单位是秒,过期之前的ajax请求无需再次进行预检了
-
跨域解决方案
- Jsonp:利用script标签可以跨域的原理实现
- Nginx:利用nginx反向代理部署成同一个域
- CORS:配置当次请求允许跨域(SpringCloud在gateway网关增加过滤器)
package com.jms.gulimail.gateway.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
@Configuration
public class CorsConfig {
//跨域配置
@Bean
public CorsWebFilter corsFilter(){
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
configSource.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(configSource);
}
}