跨域的原因
跨域是是因为浏览器的同源策略限制,是浏览器的一种安全机制,服务端之间是不存在跨域的。
所谓同源指的是两个页面具有相同的协议、主机和端口,三者有任一不相同即会产生跨域。
跨域举例
跨域的解决办法
以下跨域解决方式选择一种,重复配置不会生效。
Java 配置
-
使用 @CrossOrigin 注解实现跨域【局域类跨域】(一般不用,没有记录)
-
通过配置文件实现跨域【全局跨域】
-
通过 CorsFilter 对象实现跨域【全局跨域】
-
通过 Response 对象实现跨域【局域方法跨域】(一般不用,没有记录)
-
通过实现 ResponseBodyAdvice 实现跨域【全局跨域】(一般不用,没有记录)
-
通过配置文件实现跨域(重写 WebMvcConfigurer)
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedHeaders("*") .allowCredentials(true) .allowedMethods("GET", "POST", "OPTIONS", "DELETE", "PUT", "PATCH") .maxAge(3600); } }
|
-
返回新的 CorsFilter(跨域配置)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| @Configuration public class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); config.setAllowCredentials(true); config.addAllowedMethod("*"); config.addAllowedHeader("*"); config.addExposedHeader("*"); UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource(); corsConfigurationSource.registerCorsConfiguration("/**",config); return new CorsFilter(corsConfigurationSource); } }
|
Nginx 配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| server { listen 80; server_name your_domain.com; location /api { # 允许跨域请求的域名,* 表示允许所有域名访问 add_header 'Access-Control-Allow-Origin' '*';
# 允许跨域请求的方法 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
# 允许跨域请求的自定义 Header add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept';
# 允许跨域请求的 Credential add_header 'Access-Control-Allow-Credentials' 'true';
# 预检请求的存活时间,即 Options 请求的响应缓存时间 add_header 'Access-Control-Max-Age' 3600;
# 处理预检请求 if ($request_method = 'OPTIONS') { return 204; } } # 其他配置... }
|
Gateway 网关配置
-
通过在配置文件中配置跨域实现。
-
通过在框架中添加 CorsWebFilter 来解决跨域问题。
-
通过在配置文件中配置跨域实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| spring: cloud: gateway: globalcors: cors-configurations: '[/**]': allowedHeaders: "*" allowedOrigins: "*" allowedMethods: - GET - POST - PUT - DELETE - OPTIONS
|
-
通过在框架中添加 CorsWebFilter 来解决跨域问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| @Configuration public class GlobalCorsConfig { @Bean public CorsWebFilter corsWebFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); config.addExposedHeader("*"); config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); } }
@Configuration public class GlobalCorsConfig {
@Bean public CorsWebFilter corsWebFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOriginPattern("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); config.addExposedHeader("*"); config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); } }
|