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 {@Overridepublic 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);
转载于:https://www.cnblogs.com/u-n-owen/p/10715659.html
CORS在Spring中的实现相关推荐
- Spring中的设计模式之Handler模式(一)
Handler模式 命名空间解析中的NamespaceHandler(静态的Handler处理方式) NamespaceHandlerSupport(Abstract) ContextNamespac ...
- Spring中配置DataSource数据源的几种选择
Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...
- 详解设计模式在Spring中的应用
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,螃蟹在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了 ...
- Spring中利用applicationContext.xml文件实例化对象和调用方法
Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘,链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q 提取码: ...
- 【spring 5】AOP:spring中对于AOP的的实现
在前两篇博客中,介绍了AOP实现的基础:静态代理和动态代理,这篇博客介绍spring中AOP的实现. 一.采用Annotation方式 首先引入jar包:aspectjrt.jar && ...
- Spring中WebApplicationContext
ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用"容器"来表述它更容易理解一 些,ApplicationContext则是& ...
- Spring中使用Schedule调度
在spring中两种办法使用调度,以下使用是在spring4.0中. 一.基于application配置文件,配置入下: 1 <bean id="jobDetail" cla ...
- Spring中SmartLifecycle和Lifecycle的作用和区别
欢迎关注方志朋的博客,回复"666"获面试宝典 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如 ...
- 惊呆了,Spring中竟然有12种定义bean的方法
前言 在庞大的 Java 技术体系中,Spring 有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜. 我们都知道 Spring 是创建和管理bean的工厂,它提供了多种方式定义 bean,能 ...
最新文章
- gzip压缩後的javascript在ie下不加载
- python装饰器类-python_类装饰器
- Service的理解和使用
- java 异常练习题_java入门异常处理练习题问题
- Linux系统安装MySQL5.7,授权远程登陆
- 【接口测试】axios测试接口
- PDF to Word Document Converter for Mac(PDF格式转换必备)
- uva10668二分解方程
- Elasticsearch 集成 SpringBoot并进行CRUD操作
- OpenCV中的图片截取和颜色通道提取
- python化学模拟_rdkit 化学反应高级功能
- android铃声代码,Android之来电铃声设置(示例代码)
- 云服务器多开账号,怎么用云服务器多开模拟器
- CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的制备方法
- 介于上海与江苏的地铁小户型
- hive以半小时为维度进行统计的需求
- 配置AD域环境、OU、GPO
- 冲刺!这篇 1658 页的《Java 面试突击核心讲》学明白保底年薪 30w
- java项目 基于springboot家具定制网站idea
- 服务器环境配置项目论文,服务器配置与管理论文范文:服务器配置论文
热门文章
- 数据结构之跳表Skiplist
- 谷歌邮箱上不了的情况下怎么登录谷歌邮箱
- 【SICP练习】84 练习2.56
- MS_SQL_获取字符串最后出现的字符串及位置
- SAP事务码f-02做账界面显示“页数”字段
- php监听订单状态,ecshop数据库订单状态判断
- java类为什么要建两个class_ClassLoader的几个概念、类和对象的解释
- 分布式系统中节点之间的同步形成区块链
- javascript网络_没有JavaScript的网络外观
- 成本管理系统开源_开源教科书如何降低大学成本