龙空技术网

SpringMVC跨域CORS的各种解决方式

Spring全家桶实战案例 293

前言:

现在各位老铁们对“spring mvc跨域”都比较珍视,你们都想要剖析一些“spring mvc跨域”的相关知识。那么小编同时在网上搜集了一些关于“spring mvc跨域””的相关知识,希望你们能喜欢,你们快快来学习一下吧!

环境:Spring5.3.23

概述

Spring MVC允许你处理CORS(跨源资源共享)。

出于安全原因,浏览器禁止AJAX调用当前源之外的资源。例如,可以在一个选项卡中显示你的银行帐户,在另一个选项卡中显示other.com。来自other.com的脚本应该不能使用你的凭据向你的银行API发出AJAX请求——例如从你的帐户中提款!

跨域资源共享(CORS)是由大多数浏览器实现的W3C规范,它允许你指定授权哪种类型的跨域请求,而不是使用基于IFRAME或JSONP的安全性较低且功能较弱的解决方案。

解决方案

CORS规范区分了preflight请求、简单请求和实际请求。要了解CORS是如何工作的。

Spring MVC HandlerMapping实现为CORS提供了内置支持。在成功地将请求映射到处理程序之后,HandlerMapping实现将检查给定请求和处理程序的CORS配置,并采取进一步的操作。preflight请求被直接处理,而简单和实际的CORS请求被拦截、验证,并设置所需的CORS响应报头。

为了启用跨源请求(即存在Origin报头,并且与请求的主机不同),需要显式声明一些CORS配置。如果没有找到匹配的CORS配置,则拒绝preflight请求。简单和实际的CORS请求的响应中没有添加CORS头,因此浏览器会拒绝它们。

每个HandlerMapping都可以使用基于URL模式的CorsConfiguration映射单独配置。在大多数情况下,应用程序使用MVC Java Config或XML名称空间来声明此类映射,这导致将单个全局映射传递给所有HandlerMapping实例。

可以将HandlerMapping级别的全局CORS配置与更细粒度的处理程序级CORS配置结合起来。例如,带注释的控制器可以使用类级或方法级的@CrossOrigin注释(其他处理程序可以实现CorsConfigurationSource)。

组合全局配置和本地配置的规则通常是附加的——例如,所有全局源和所有本地源。对于那些只能接受单个值的属性,例如allowCredentials和maxAge,局部值将覆盖全局值。

@CrossOrigin

@CrossOrigin注释在带注释的控制器方法上支持跨源请求,如下例所示:

@RestController@RequestMapping("/account")public class AccountController {  @CrossOrigin  @GetMapping("/{id}")  public Account retrieve(@PathVariable Long id) {    // ...     }}

默认情况下,@CrossOrigin允许:

All origins.All headers.控制器方法映射到的所有HTTP方法。

默认情况下,allowCredentials没有启用,因为它建立了一个信任级别,暴露了敏感的用户特定信息(比如cookie和CSRF令牌),应该只在适当的地方使用。当它被启用时,要么allowOrigins必须被设置为一个或多个特定的域(不能用"*"),要么allowOriginPatterns属性可以被用来匹配一个动态的起源集。

maxAge 设置为30分钟。

@CrossOrigin在类级别上也被支持,并被所有方法继承,如下例所示:

@CrossOrigin(origins = ";, maxAge = 3600)@RestController@RequestMapping("/account")public class AccountController {  @GetMapping("/{id}")  public Account retrieve(@PathVariable Long id) {    // ...  }}

你可以在类级别和方法级别使用@CrossOrigin,如下面的例子所示:

@CrossOrigin(maxAge = 3600)@RestController@RequestMapping("/account")public class AccountController {  @CrossOrigin(";)  @GetMapping("/{id}")  public Account retrieve(@PathVariable Long id) {    // ...  }}
全局跨域配置

除了细粒度的控制器方法级配置之外,你可能还想定义一些全局CORS配置。你可以在任何HandlerMapping上单独设置基于url的CorsConfiguration映射。然而,大多数应用程序使用MVC Java配置或MVC XML名称空间来实现这一点。

缺省情况下,全局配置使能以下功能:

All origins.All headers.GET, HEAD, and POST methods.

默认情况下,allowCredentials没有启用,因为它建立了一个信任级别,暴露了敏感的用户特定信息(比如cookie和CSRF令牌),应该只在适当的地方使用。当它被启用时,要么allowOrigins必须被设置为一个或多个特定的域(不能用"*"),要么allowOriginPatterns属性可以被用来匹配一个动态的起源集。

maxAge 设置为30分钟。

编程配置

要在MVC Java配置中启用CORS,您可以使用CorsRegistry回调,如下面的示例所示:

@Configuration@EnableWebMvcpublic class WebConfig implements WebMvcConfigurer {  @Override  public void addCorsMappings(CorsRegistry registry) {    registry.addMapping("/api/**")      .allowedOrigins(";)      .allowedMethods("PUT", "DELETE")      .allowedHeaders("header1", "header2", "header3")      .exposedHeaders("header1", "header2")      .allowCredentials(true).maxAge(3600);  }}
过滤器配置

可以通过内置的CorsFilter应用CORS支持。

如果你尝试将CorsFilter与Spring Security一起使用,请记住Spring Security已经内置了对CORS的支持。

要配置过滤器,将CorsConfigurationSource传递给它的构造函数,如下例所示:

CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);config.addAllowedOrigin(";);config.addAllowedHeader("*");config.addAllowedMethod("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);CorsFilter filter = new CorsFilter(source);

完毕!!! 求关注

SpringBoot对Spring MVC都做了哪些事?(一)

SpringBoot对Spring MVC都做了哪些事?(二)

SpringBoot对Spring MVC都做了哪些事?(三)

SpringBoot对Spring MVC都做了哪些事?(四)

Spring中的@Configuration注解你真的了解吗?

Spring 强大的数据验证功能

Spring中字段格式化的使用详解

Spring容器这些扩展点你都清楚了吗?

Spring MVC 异步请求方式 Spring MVC 异常处理方式

标签: #spring mvc跨域