后端解决跨域问题
# Spring Boot 中处理跨域的几种方式
前言
在 Spring Boot 中,跨域资源共享(CORS, Cross-Origin Resource Sharing)是一个常见问题。默认情况下,浏览器出于安全考虑,阻止前端对不同源(协议、域名或端口)的请求。为了允许跨域请求,我们可以通过多种方式在后端进行配置。
# 一、使用 @CrossOrigin
注解
@CrossOrigin
注解是最简单的一种跨域配置方式,通常用于局部接口的跨域处理。
适用场景:需要对某个特定的控制器或方法进行跨域配置。
代码示例:
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://example.com", maxAge = 3600) // 允许来自指定来源的跨域请求
public class ExampleController {
@GetMapping("/data")
public String getData() {
return "This is a cross-origin response.";
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
关键配置项:
origins = "http://example.com"
:指定允许的跨域来源。maxAge = 3600
:指定预检请求的缓存时间(单位:秒),减少跨域请求的预检次数。
优点:简单快捷,适合对单个控制器或方法进行配置。
缺点:配置分散,不适合需要统一管理跨域规则的场景。
# 二、实现 WebMvcConfigurer
接口进行全局配置
WebMvcConfigurer
接口提供了更灵活的跨域配置方式,可以对整个应用进行统一的跨域设置。
适用场景:需要全局统一配置跨域规则,或者对部分路径进行跨域处理。
代码示例:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 配置允许跨域的路径
registry.addMapping("/**")
// 允许的跨域来源
.allowedOrigins("http://example.com")
// 允许的请求头
.allowedHeaders("*")
// 允许的请求方法
.allowedMethods("GET", "POST", "PUT", "DELETE")
// 是否允许携带 Cookie
.allowCredentials(true)
// 预检请求的有效期,单位为秒
.maxAge(3600);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
关键配置项:
addMapping("/**")
:配置允许跨域的路径,"/**"
表示应用于所有路径。allowedOrigins("http://example.com")
:指定允许跨域的来源。allowedHeaders("*")
:允许的请求头,"*"
表示允许所有请求头。allowedMethods("GET", "POST", "PUT", "DELETE")
:允许的请求方法。allowCredentials(true)
:是否允许携带 Cookie,注意与allowedOrigins("*")
不能同时使用。maxAge(3600)
:预检请求的有效期。
优点:全局配置,便于统一管理跨域规则。
缺点:配置需要在代码层面实现,灵活性较高,但不如注解简单。
# 三、自定义 CorsFilter
自定义 CorsFilter
是一种底层的跨域处理方式,通过过滤器对所有请求进行跨域配置,适合更复杂的场景。
适用场景:需要更精细的跨域控制,如在过滤器中动态设置跨域规则。
代码示例:
package com.example.common.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 {
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 配置跨域规则
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 允许所有来源
corsConfiguration.addAllowedHeader("*"); // 允许所有请求头
corsConfiguration.addAllowedMethod("*"); // 允许所有方法
corsConfiguration.setAllowCredentials(true); // 允许携带 Cookie
// 对所有路径应用跨域配置
source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(source);
}
}
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
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
关键配置项:
addAllowedOrigin("*")
:允许所有来源。生产环境下,建议明确配置允许的来源。addAllowedHeader("*")
:允许所有请求头。addAllowedMethod("*")
:允许所有请求方法。setAllowCredentials(true)
:允许携带 Cookie,注意此配置与allowedOrigins("*")
不能同时使用。
优点:适用于需要更精细化控制的跨域场景,可以通过编程方式动态调整跨域规则。
缺点:实现复杂度较高,通常用于更复杂的跨域控制需求。
# 四、三种方式的对比
方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
@CrossOrigin 注解 | 简单快捷,适合局部配置 | 配置分散,难以统一管理跨域规则 | 需要对单个控制器或方法进行跨域配置时 |
实现 WebMvcConfigurer 接口 | 全局配置,灵活性高 | 配置在代码层面实现,灵活性高但复杂度也较高 | 需要全局统一配置跨域规则时 |
自定义 CorsFilter | 底层控制,适合复杂的跨域需求 | 实现复杂度较高,需要处理更多细节 | 需要动态调整跨域规则或更精细化控制时 |
总结
- 对于简单的跨域需求,如只针对单个控制器或方法,使用
@CrossOrigin
注解即可。 - 如果项目中所有接口都需要支持跨域,推荐通过实现
WebMvcConfigurer
接口进行全局配置。 - 如果需要更精细化或动态的跨域控制,可以自定义
CorsFilter
来实现。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08