前言:
现在各位老铁们对“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跨域