Spring Boot解决跨域问题的技术方案及代码示例

2024-05-20 15:36:03 浏览数 (2)

Spring Boot 应用程序中的跨域问题主要是由于浏览器的同源策略(Same-Origin Policy)所导致的。同源策略是浏览器的一个核心安全模型,规定了一个源(由协议、域名、端口号三部分组成)加载的文档或脚本,在没有明确授权的情况下,不允许与来自不同源的网页进行交互,例如发送Ajax请求、读取DOM内容等。

产生原因:

当前端应用(如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方法等。

0 人点赞