13:SpringBoot跨域解决方案-Java Spring

1 阅读4分钟

13.1 CorsFilter

SpringBoot设置CORS的的本质都是通过设置响应头信息来告诉前端该请求是否支持跨域。

CorsFilter是Java Servlet规范提供的一个过滤器(javax.servlet.Filter的实现),专门用于处理跨域资源共享(CORS)请求。它可以被配置在Web应用的过滤器链中,对所有经过的HTTP请求进行检查,根据预定义的规则决定是否允许跨域访问。

特点与功能

  • 标准化处理:遵循W3C CORS规范,自动处理预检(OPTIONS)请求和实际请求。
  • 灵活性:可以配置允许的源(origins)、方法(methods)、头(headers)、是否允许凭证(credentials)、预检缓存时间(maxAge)等。
  • 易于集成:作为Servlet Filter,适用于任何基于Servlet容器(如Tomcat、Jetty、Undertow等)的Web应用,不论是否使用Spring框架。

参考:CORS Filter

依赖引入

<dependency>
	<groupId>com.thetransactioncompany</groupId>
	<artifactId>cors-filter</artifactId>
	<version>[ version ]</version>
</dependency>

配置类

提供一个自定义的 @Configuration 配置类,自定义 CorsFilter 过滤器,添加映射路径和具体的 CORS 配置路径

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 CorsFilterConfiguration {
 
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration configuration = new CorsConfiguration();
        
        //允许所有源请求跨域,* 表示不限制
        configuration.addAllowedOrigin("*");
        
		//跨域请求默认不包含Cookie,设置为true可以包含Cookie
        configuration.setAllowCredentials(true);
        
        //允许所有方法跨域,或者设置请求方式GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
        configuration.addAllowedMethod("*");
        
        //允许所有原始请求头信息
        configuration.addAllowedHeader("*");
        
  		//允许暴露哪些头信息,为了安全问题不能设置成*,否则会报错:throw new IllegalArgumentException("'*' is not a valid exposed header value");
  	    configuration.addExposedHeader("");
  	    
        //设置请求有效时间
        configuration.setMaxAge(3600L);
        
        //2.添加映射路径,即允许对方可以访问本应用下的哪些请求接口,/** 表示所有请求
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
        
        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }
}

13.2 @CrossOrigin

@CrossOrigin注解表示局部跨域,可以用在类或者方法上。

SpringMVC在4.2以上版本才支持@CrossOrigin,@CrossOrigin 是Spring框架提供的一个注解,用于简化Spring MVC控制器方法或整个控制器类的CORS配置。相较于CorsFilter,它提供了更为简洁的声明式配置方式。

特点与功能

  • 便捷性:只需在控制器方法或类上添加注解,无需编写额外的过滤器代码。
  • 精细控制:可以在方法级别精确控制哪些路径允许跨域访问,支持细粒度的CORS配置。
  • 与Spring MVC无缝集成:适用于基于Spring MVC构建的Web应用,无需关注底层Servlet容器。

在控制器方法上启用跨域:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/account")

public class TestController {
	//origins表示允许的域,用在控制器方法上,表示该方法都允许跨域
    @CrossOrigin(origins = "*")
    @GetMapping("test")
    public String test() {
        return "success";
    }
}

或在控制器类级别启用跨域,影响该类下所有方法:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
//maxAge表示准备响应前的缓存持续的最大时间,单位为秒,用在控制器类上,表示该类的所有方法都允许跨域
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")

public class TestController {
    @GetMapping("test")
    public String test() {
        return "success";
    }
}

13.3 WebMvcConfigurer

WebMvcConfigurer 是Spring MVC的一个配置接口,用于定制Spring MVC的行为,包括但不限于视图解析、静态资源处理、拦截器、消息转换器等。在CORS场景中,可以通过实现该接口来自定义全局的CORS配置。

实现 WebMvcConfigurer全局跨域),重写 addCorsMappings 方法设置跨域映射:

  • addMapping 配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
  • allowedMethods:允许所有的请求方法访问该跨域资源服务器,如:POST、GET、PUT、DELETE等。
  • allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:“www.aaa.com”,只有该域名可以访问我们的跨域资源。
  • allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
	@Override
	public void addCorsMappings(CorsRegistry registry) {

		registry.addMapping("/**")
		//允许所有源请求跨域,* 表示不限制
		.allowedOrigins("*")
        //允许所有原始请求头信息
		.allowedHeaders("*")
		//允许所有方法跨域,或者设置请求方式GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
		.allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS", "HEAD")
		//允许包含Cookie
		.allowCredentials(true)
  		//允许暴露哪些头信息,为了安全问题不能设置成*
		//.exposedHeaders();
		.maxAge(3600);
	}
}

总结来说,CorsFilter@CrossOriginWebMvcConfigurer都是用来配置和实现CORS的工具,它们分别适用于不同的场景和需求:

  • CorsFilter:适用于非Spring MVC应用或需要在Servlet容器级别统一处理CORS的场景。
  • @CrossOrigin:适用于Spring MVC应用,希望在控制器方法或类级别快速、方便地配置CORS。
  • WebMvcConfigurer:适用于Spring MVC应用,需要全局、精细控制CORS策略,或者与其他Spring MVC配置一起集中管理。