CORS在Spring中的实现
CORS:
通常情况下浏览器禁止AJAX从外部获取资源,因此就衍生了CORS这一标准体系,来实现跨域请求。
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制.
跨域请求在java spring MVC中的实现:
Spring MVC HandlerMapping 接口对CORS提供了一个内部支持,在成功的映射到一个处理器的请求之后,HanderMapping接口检查CORS的请求配置文件,然后采取下一步行动,预检(Preflight)请求能够被直接的处理,而简单和直接的CORS请求将会被拦截和经过验证,同时还需要CORS请求头的进一步设置。
因此,为了确保能够实现跨域请求,在请求头中会加入Origin这一字段,来实现跨域请求,同时对于不同的主机而言请求头是不一样的。你必须有一些明确的声明的配置文件,如果相应的CORS的配置文件没有找到的话,预检请求将会被拒绝,同时请求头也不会加到相应的响应当中。每一个
HandlerMapping能够被独立的配置带着基于
CorsConfiguration
映射的url模式。通常情况下应用使用MVC Java的配置文件或者XML命名空间来声明这样的映射。通常情况下能够使每一个单一的map映射通过所有的HandlerMapping实例。
@CrossOrigin:
这个注解能够使跨域请求实现在注解控制器里面:主要的实现方法如下:
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
public void remove(@PathVariable Long id) {
// ...
}
}
默认情况下上述注解还实现了以下功能:
1 :所有的origin请求字段。
2:所有的请求头。
3: 所有的被映射的HTTP方法。
同时@Crossorigin继承所有的类和方法,相关的示例如下:
@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
全局配置:
默认情况下,全局配置需要能够满足以下几点:
1 :所有的:Ogrigin字段
2:所有的请求头。
3 :GET HEAD 和POST 方法。
为了能够使CORS(跨域请求)在MVC 的Java 的配置文件里面配置,你需要使用CorsRegistry回调接口,具体的实现例子如下:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(true).maxAge(3600);
// Add more mappings...
}
}
XML配置:
为了能够使CORS(跨域请求)实现在XML的命名空间需要使用<mvc:cors>组件元素,具体的实现例子如下:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="https://domain1.com, https://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="true"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="https://domain1.com" />
</mvc:cors>
CORS Fliter:
你可以使跨域请求内置在CorsFliter类当中(即跨域过滤器)。实现配置这个过滤器,CorsConfigurationSource及其构造函数。相关的示例如下:
CorsConfiguration config = new CorsConfiguration();
// Possibly...
// config.applyPermitDefaultValues()
config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
CorsFilter filter = new CorsFilter(source);
默认情况下上述注解还实现了以下功能:
1 :所有的origin请求字段。
2:所有的请求头。
3: 所有的被映射的HTTP方法。
同时@Crossorigin继承所有的类和方法,相关的示例如下:
@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController { @GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
} @DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
全局配置:
默认情况下,全局配置需要能够满足以下几点:
1 :所有的:Ogrigin字段
2:所有的请求头。
3 :GET HEAD 和POST 方法。
为了能够使CORS(跨域请求)在MVC 的Java 的配置文件里面配置,你需要使用CorsRegistry回调接口,具体的实现例子如下:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer { @Override
public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**")
.allowedOrigins("https://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(true).maxAge(3600); // Add more mappings...
}
}
XML配置:
为了能够使CORS(跨域请求)实现在XML的命名空间需要使用<mvc:cors>组件元素,具体的实现例子如下:
<mvc:cors> <mvc:mapping path="/api/**"
allowed-origins="https://domain1.com, https://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="true"
max-age="123" /> <mvc:mapping path="/resources/**"
allowed-origins="https://domain1.com" /> </mvc:cors>
CORS Fliter:
你可以使跨域请求内置在CorsFliter类当中(即跨域过滤器)。实现配置这个过滤器,CorsConfigurationSource及其构造函数。相关的示例如下:
CorsConfiguration config = new CorsConfiguration(); // Possibly...
// config.applyPermitDefaultValues() config.setAllowCredentials(true);
config.addAllowedOrigin("https://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config); CorsFilter filter = new CorsFilter(source);
CORS在Spring中的实现的更多相关文章
- Spring中文文档
前一段时间翻译了Jetty的一部分文档,感觉对阅读英文没有大的提高(*^-^*),毕竟Jetty的受众面还是比较小的,而且翻译过程中发现Jetty的文档写的不是很好,所以呢翻译的兴趣慢慢就不大了,只能 ...
- Velocity初探小结--Velocity在spring中的配置和使用
最近正在做的项目前端使用了Velocity进行View层的数据渲染,之前没有接触过,草草过了一遍,就上手开始写,现在又回头细致的看了一遍,做个笔记. velocity是一种基于java的模板引擎技术, ...
- Spring中Bean的作用域、生命周期
Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...
- Spring中Bean的实例化
Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...
- 模拟实现Spring中的注解装配
本文原创,地址为http://www.cnblogs.com/fengzheng/p/5037359.html 在Spring中,XML文件中的bean配置是实现Spring IOC的核心配置文件,在 ...
- Spring中常见的bean创建异常
Spring中常见的bean创建异常 1. 概述 本次我们将讨论在spring中BeanFactory创建bean实例时经常遇到的异常 org.springframework.beans.fa ...
- Spring中配置数据源的4种形式
不管采用何种持久化技术,都需要定义数据源.Spring中提供了4种不同形式的数据源配置方式: spring自带的数据源(DriverManagerDataSource),DBCP数据源,C3P0数据源 ...
- spring中InitializingBean接口使用理解
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: imp ...
- Quartz 在 Spring 中如何动态配置时间--转
原文地址:http://www.iteye.com/topic/399980 在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源 ...
随机推荐
- redis maxheap 51200000
Redis无法启动 今天在启动Redis时提示以下错: C:\Java\redis2817>redis-server.exe redis.windows.conf [5268] 23 Apr 1 ...
- iOS 如何在自定义类中支持 "[]" 运算符
在相应类中实现如下协议即可. 1.字典类 - (id)objectForKeyedSubscript:(NSObject <NSCopying> *)key; - (void)setObj ...
- oracle 11g 安装步骤
指定安装路径 输入数据库名(cwbpm),(按照自己要求输入,可以直接用默认库名) 输入密码(自定义):123456 (自定义密码) 下一步 选择“是” 点击完成,开始安装数据库 安装完成后会弹出页面 ...
- angular4 使用swiper 首次加载问题(一)
angular 在使用外部插件swiper 还是有不少小坑的,下面来聊一聊.angular在使用swiper 的一些坑 一开始觉得使用外部引入的方式比较好,就在外部定义了.简单快捷方便, 但是在开发后 ...
- ORA-01589解决
错误展现如下: sqlplus /nolog SQL> conne /as sysdbaConnected.SQL> shutdown abortORACLE instance shut ...
- python习题二
1.输入1-127的ascii码并输出对应的字符 for i in range(1,128): print(chr(i)) 2.输入a,b,c,d,4个整数,计算a+b-c*d的结果 a = i ...
- PHP中文转拼音
网上大都讲的,都不支持繁体字,毕竟就是一个函数解决的事. 推荐一个很好的扩展,github地址: https://github.com/overtrue/pinyin 怎么用,自己去看就行了.
- 画多边形form并填充背景色(可以实现圆角边框 有锯齿)
public Form1() { InitializeComponent(); this.BackColor = ColorTranslator.FromHtml("#F7F1F1" ...
- 组装一台PRUSA I3打印机
闲来无事,又搞了台机.这样下去顶不住了.草. 还是咸鱼购买,但是这台收到的时候比我以前任何一台都要散,几乎重新装了一台. 此处省略收到货时候的零件图,省略装机图. 不得不提的是,原机用的山寨melzi ...
- Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了 ...