产生原因:
当前端应用(如SPA应用或移动Hybrid应用中的Web视图)通过JavaScript发起HTTP请求到与当前页面所在源不同的服务器时,就涉及到了跨域。例如,前端应用部署在 `http://app.example.com` ,但尝试访问位于 `http://api.example.net` 的API服务,由于协议、域名或端口至少有一项不同,浏览器会按照同源策略阻止这种跨域请求,除非服务器明确表明允许这样的跨域访问。
在Spring Boot项目中解决跨域问题可以通过多种方式实现,以下是其中几种常见且实用的方法,以及相应的代码示例:
1. 使用 `@CrossOrigin` 注解
局部跨域配置:在单个控制器类或方法上使用 `@CrossOrigin` 注解来启用跨域。
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin(origins = "http://example.com", maxAge = 3600)
public class MyController {
@GetMapping("/api/data")
public String getData() {
return "Hello, Cross-Origin!";
}
}
这里,`@CrossOrigin` 注解允许来自 `http://example.com` 的跨域请求,并设置了预检请求(OPTIONS)的缓存时间为3600秒。
2. 全局跨域配置
全局跨域过滤器:通过实现 `CorsFilter` 或者在配置类中定义一个Bean来全局允许跨域。
import org.springframework.boot.web.servlet.FilterRegistrationBean;
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 FilterRegistrationBean<CorsFilter> corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
// 允许所有来源
config.setAllowedOrigins(Arrays.asList("*"));
// 允许的请求头
config.addAllowedHeader("*");
// 允许的请求方法
config.addAllowedMethod("*");
// 预检请求的缓存时间(可选,默认1800秒)
config.setMaxAge(3600L);
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
}
在这个例子中,我们创建了一个全局的CorsFilter,允许所有来源进行跨域访问,并允许所有请求头和方法。
3. 通过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 WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
这里的 `addCorsMappings` 方法用于全局配置跨域策略,同样允许所有来源、方法、请求头,并且允许携带凭证(cookies)进行跨域请求。
以上都是针对Spring Boot项目的跨域解决方案及其对应的代码示例。在实际应用中,根据安全性和项目需求调整具体的跨域策略,如仅允许特定域名、特定HTTP方法等。