博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring利用@CrossOrigin注解 实现 支持CORS跨域请求
阅读量:6693 次
发布时间:2019-06-25

本文共 2537 字,大约阅读时间需要 8 分钟。

  hot3.png

 

在框架4.2版本后,Spring给出了注解的方式解决问题。

即在Controller控制器中,在Controller注解上方添加@CrossOrigin注解。

但是使用这种方式后也有可能仍然出现跨域问题,解决方案之一就是:

在@RequestMapping注解中没有指定Get、Post方式

 

 

如果想要对某一接口配置 CORS,可以在方法上添加 CrossOrigin 注解:

@CrossOrigin(origins = {"http://localhost:9000", "null"})@RequestMapping(value = "/test", method = RequestMethod.GET)public String greetings() {    return "{\"project\":\"just a test\"}";}

第二种情况,如果想对一系列接口添加 CORS 配置,可以在类上添加注解,对该类声明所有接口都有效:

CrossOrigin(origins = {"http://localhost:9000", "null"})@RestController@SpringBootApplicationpublic class SpringBootCorsTestApplication {    // xxx}

第三种情况,添加全局配置,则需要添加一个配置类:

@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {    @Override    public void addCorsMappings(CorsRegistry registry) {        registry.addMapping("/**")                .allowedOrigins("http://localhost:9000", "null")                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")                .maxAge(3600)                .allowCredentials(true);    }}

另外,还可以通过添加 Filter 的方式,配置 CORS 规则,并手动指定对哪些接口有效。

@Beanpublic FilterRegistrationBean corsFilter() {    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();    CorsConfiguration config = new CorsConfiguration();    config.setAllowCredentials(true);	config.addAllowedOrigin("http://localhost:9000");    config.addAllowedOrigin("null");    config.addAllowedHeader("*");    config.addAllowedMethod("*");    source.registerCorsConfiguration("/**", config); // CORS 配置对所有接口都有效    FilterRegistrationBean bean = newFilterRegistrationBean(new CorsFilter(source));    bean.setOrder(0);    return bean;}

4. 实现剖析

无论是通过哪种方式配置 CORS,其实都是在构造 CorsConfiguration。

一个 CORS 配置用一个 CorsConfiguration 类来表示,它的定义如下:

public class CorsConfiguration {    private List
allowedOrigins; private List
allowedMethods; private List
allowedHeaders; private List
exposedHeaders; private Boolean allowCredentials; private Long maxAge;}

Spring MVC 中对 CORS 规则的校验,都是通过委托给 DefaultCorsProcessor 实现的。

DefaultCorsProcessor 处理过程如下:

  1. 判断依据是 Header 中是否包含 Origin。如果包含则说明为 CORS 请求,转到 2;否则,说明不是 CORS 请求,不作任何处理。
  2. 判断 response 的 Header 是否已经包含 Access-Control-Allow-Origin,如果包含,证明已经被处理过了, 转到 3,否则不再处理。
  3. 判断是否同源,如果是则转交给负责该请求的类处理
  4. 是否配置了 CORS 规则,如果没有配置,且是预检请求,则拒绝该请求,如果没有配置,且不是预检请求,则交给负责该请求的类处理。如果配置了,则对该请求进行校验。

校验就是根据 CorsConfiguration 这个类的配置进行判断:

  1. 判断 origin 是否合法
  2. 判断 method 是否合法
  3. 判断 header 是否合法
  4. 如果全部合法,则在 response header 中添加响应的字段,并交给负责该请求的类处理,如果不合法,则拒绝该请求。

转载于:https://my.oschina.net/hccake/blog/886606

你可能感兴趣的文章
CDH安装系统环境准备——系统版本和安装包下载地址指南
查看>>
一个灵活设置十六进制颜色值的方法
查看>>
JavaScript 工作原理之十四-解析,语法抽象树及最小化解析时间的 5 条小技巧...
查看>>
Java杂记9—NIO
查看>>
算法(四):图解狄克斯特拉算法
查看>>
css3动画属性整理
查看>>
如何针对性替换数组里的某几个对象
查看>>
git基础整理
查看>>
【前端】 form.get 方式上传对象数组给后台
查看>>
阿里智能工作软件机器人——码栈应用教程,让一切变得自动化
查看>>
Angular service 详解
查看>>
百度研发面经
查看>>
深度解析 Go 语言中「切片」的三种特殊状态
查看>>
ES6 - 函数扩展
查看>>
Linux中apt与apt-get命令的区别与解释(转)
查看>>
原生js 类名操作 增加 删除
查看>>
iOS 中多音频处理
查看>>
java.lang.IllegalStateException: aidl is missing
查看>>
js的数组和对象的多种"复制"和"清空", 以及区分JS数组和对象的方法
查看>>
爬虫提交form表单中含有(unable to decode value)解决方法
查看>>