在 Web 应用中,跨域请求已经成为一个常见的问题。浏览器出于安全考虑,限制了不同源之间的请求,这种限制被称为同源策略。当我们的前端应用和后端 API 部署在不同的域名或端口下时,就会出现跨域问题。为了保证应用的正常运行,解决跨域问题显得尤为重要。本文将介绍两种常见的 Spring Boot 跨域解决方案:WebMvcConfigurer
和 FilterRegistrationBean
。
常见的跨域产生条件:
example.com
,后端在 api.example.com
。localhost:3000
,后端在 localhost:8080
。WebMvcConfigurer
是 Spring MVC 提供的一个接口,允许我们通过实现该接口来定制 Spring MVC 的配置。它提供了一系列钩子方法,便于我们进行全局配置。
下面是通过实现 WebMvcConfigurer
接口来配置跨域的示例代码:
@Configuration
public class SpringMvcConfiguration implements WebMvcConfigurer{
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowCredentials(true)
.allowedOrigins("*")
.allowedHeaders("*")
.allowedMethods("*")
.maxAge(1800L);
}
}
allowedOrigins
:可以指定允许的来源,可以是特定的域名。allowedMethods
:指定允许的 HTTP 方法,需根据实际需求配置。allowedHeaders
:指定允许的请求头,使用 "*"
表示允许所有请求头,具体可以根据需求进行限制。allowCredentials
:是否允许携带凭据(如 Cookies)。FilterRegistrationBean
是 Spring Boot 提供的用于注册过滤器的工具。通过注册自定义的过滤器,我们可以灵活地处理请求和响应,包括设置跨域相关的响应头。
以下是通过 FilterRegistrationBean
实现跨域配置的示例代码:
@Configuration
public class CorsConfig {
@Bean
public FilterRegistrationBean<CorsFilter> corsFilterBean() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(true);
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setMaxAge(1800L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfiguration);
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Integer.MIN_VALUE);
return bean;
}
}
本文介绍了两种在 Spring Boot 中处理跨域请求的方法:使用 WebMvcConfigurer
和 FilterRegistrationBean
。WebMvcConfigurer
方法相对简单,适合大多数场景;而 FilterRegistrationBean
方法提供了更大的灵活性,适合需要定制化处理的场景。