spring boot / cloud (六) 开启CORS跨域访问

前言

什么是CORS?

Cross-origin resource sharing(跨域资源共享),是一个W3C标准,它允许你向一个不同源的服务器发出XMLHttpRequest请求,从而克服了ajax只能请求同源服务的限制.并且也可以通过灵活的设置,来指定什么样的请求是可以被授权的.

什么是跨域?

假设你在http://xxx.com/test/下有一个js文件,从这个js里发出一个ajax请求请求后端服务,按照如下情况判定:

请求地址 原因 结果
http://xxx.com/xxxx/action 同一域名,不同文件夹 非跨域
http://xxx.com/test/action 同一域名,同一文件夹 非跨域
http://a.xxx.com/test/action 不同域名,文件路径相同 跨域
http://xxx.com:8080/test/action 同一域名,不同端口 跨域
https://xxx.com/test/action 同一域名,不同协议 跨域

还有那些其他的跨域解决方案?

  • JSONP : 动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了,而缺点也很明显,它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题

  • NGINX代理 : 通过一个代理服务器,将跨域的请求转发,如:前端JS在http://www.demo.com/a.js,后端是http://www.abc.com/app/action,通过代理可将后端的地址转换成http://www.demo/app/action,这样,从前端发起的请求,就不存在跨域的情况了

然后CORS是支持所有类型的HTTP请求,并且也只是服务端进行设置即可,但是缺点就是老的浏览器不支持CORS(如:IE7,7,8,等)

思路

CORS的响应头

  • Access-Control-Allow-Origin : 必须的,允许的域名,如果设置*,则表示接受任何域名

  • Access-Control-Allow-Credentials : 非必须的,表示是否允许发送Cookie,注意,当设置为true的时候,客户端的ajax请求,也需要将withCredentials属性设置为true

  • Access-Control-Expose-Headers : 非必须的,表示客户端能拿到的header,默认情况下XMLHttpRequestgetResponseHeader方法只能拿到几个基本的header,如果有自定义的header要获取的话,则需要设置此值

  • Access-Control-Request-Method : 必须的,表示CORS上会使用到那些HTTP方法

  • Access-Control-Request-Headers : 必须的,表示CORS上会有那些额外的的有信息

CORS将请求分为两种类型

两种类型分别为简单请求非简单请求,同时满足以下两大条件的请求被定义为是简单请求:

  • 请求方法是以下三种之一:

  • HEAD

  • GET

  • POST

  • HTTP头信息不超出以下几种字段:

  • Accept

  • Accept-Language

  • Content-Language

  • Last-Event-ID

  • Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

对于非简单请求,浏览器会自动发一个预检请求,这个请求是OPTIONS方法的,主要是询问服务器当前请求是否在允许范围内

实现

1.方式A:使用@CrossOrigin来标记指定的方法(小范围跨域)

@RequestMapping(value = "add", method = RequestMethod.GET)
@CrossOrigin(methods = { RequestMethod.GET, RequestMethod.POST }, origins = "*")
public RestResponse<Integer> add(Integer a, Integer b) {
return new RestResponse<>(demoService.add(a, b));
}

2.方式B:使用spring boot的默认配置来设定全局跨域

endpoints.cors.allow-credentials=
endpoints.cors.allowed-headers=
endpoints.cors.allowed-methods=GET
endpoints.cors.allowed-origins=
endpoints.cors.exposed-headers=
endpoints.cors.max-age=1800

3.方式C:使用WebMvcConfigurer自定义配置跨域

定义CorsRegistrationConfig类

public static class CorsRegistrationConfig {
//描述 : 扫描地址
private String mapping = "/**";
//描述 : 允许证书
private Boolean allowCredentials = null;
//描述 : 允许的域
private String allowedOrigins = "*";
//描述 : 允许的方法
private String allowedMethods = "POST,GET,DELETE,PUT";
//描述 : 允许的头信息
private String allowedHeaders = "*"; .........省略
}

定义CorsConfig类

@Configuration
@ConfigurationProperties(prefix = "org.itkk.cors")
@Validated
public class CorsConfig { //描述 : 跨域信息
@NotNull
private Map<String, CorsRegistrationConfig> config; .....省略 }

定义重写addCorsMappings方法

  @Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
//扫描地址
if (!CollectionUtils.isEmpty(config)) {
Iterator<String> keys = config.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
CorsRegistrationConfig item = config.get(key);
CorsRegistration cr = registry.addMapping(item.getMapping());
if (item.getAllowCredentials() != null) {
cr.allowCredentials(item.getAllowCredentials());
}
if (StringUtils.isNotBlank(item.getAllowedOrigins())) {
String[] allowedOriginArray = item.getAllowedOrigins().split(",");
cr.allowedOrigins(allowedOriginArray);
}
if (StringUtils.isNotBlank(item.getAllowedMethods())) {
String[] allowedMethodArray = item.getAllowedMethods().split(",");
cr.allowedMethods(allowedMethodArray);
}
if (StringUtils.isNotBlank(item.getAllowedHeaders())) {
String[] allowedHeaderArray = item.getAllowedHeaders().split(",");
cr.allowedHeaders(allowedHeaderArray);
}
}
}
}
};
}

配置文件,可根据不同的mapping设置不同的cors规则

org.itkk.cors.config.demo.mapping=/**
org.itkk.cors.config.demo.allowCredentials=
org.itkk.cors.config.demo.allowedOrigins=
org.itkk.cors.config.demo.allowedMethods=
org.itkk.cors.config.demo.allowedHeaders=

使用jquery,在跨域场景下进行测试

    $(function(){
$.ajax({
url:'http://127.0.0.1:8080/demo/c',
headers:{
'aheader':'111'
},
type:'GET',
dataType:'json',
success:function(data){
console.log(1);
console.log(data);
console.log(2); }
});
});

代码仓库 (博客配套代码)

结束

演示了单spring boot的应用的,在后续的章节中,会找机会写一下在微服务场景下(spring cloud)的跨域设置


想获得最快更新,请关注公众号

spring boot / cloud (六) 开启CORS跨域访问的更多相关文章

  1. Spring Boot 2中对于CORS跨域访问的快速支持

    原文:https://www.jianshu.com/p/840b4f83c3b5 目前的程序开发,大部分都采用前后台分离.这样一来,就都会碰到跨域资源共享CORS的问题.Spring Boot 2 ...

  2. Spring Boot Web应用开发 CORS 跨域请求支持:

    Spring Boot Web应用开发 CORS 跨域请求支持: 一.Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等CORS与JSONP相比 1. JSONP只能实现 ...

  3. Spring Boot Web应用开发 CORS 跨域请求支持

    一.Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等 CORS与JSONP相比 1. JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求. 2. 使用C ...

  4. 九、Spring Boot 优雅的实现CORS跨域

    前言 我们的springboot 架手架已经包含了mysql,redis,定时任务,邮件服务,短信服务,文件上传下载,以及docker-compose 构建镜像等等. 接下来让我们解决另一个常见的问题 ...

  5. nodejs(15)express开启cors跨域

    express开启cors跨域 package.json "dependencies": { "body-parser": "^1.18.3" ...

  6. Asp.Net WebApi 启用CORS跨域访问指定多个域名

    1.后台action指定 EnableCors指定可访问的域名多个,使用逗号隔开 //支持客户端凭据提交,指定多个域名,使用逗号隔开 [EnableCors("http://localhos ...

  7. Asp.Net WebApi+Microsoft.AspNet.WebApi.Core 启用CORS跨域访问

    WebApi中启用CORS跨域访问 1.安装 Nugget包Microsoft.AspNet.WebApi.Cors This package contains the components to e ...

  8. SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问

    SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问 https://blog.csdn.net/yft_android/article/details/80307672

  9. Springboot CORS跨域访问

    Springboot CORS跨域访问 什么是跨域 浏览器的同源策略限制: 它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础 ...

随机推荐

  1. pc端的企业网站(IT修真院test8)详解1-3

    一,base.css基础样式表的意义 我昨天,整理了一下代码规范. 发现现在这个程度的页面还原.有必要创建一个规范的base.css库和framework.css库 而且也要为日后的工作整理一些常用的 ...

  2. 线程池与Threadlocal

    线程池与Threadlocal 线程池: 线程池是为了使线程能够得到循环的利用,线程池里面养着一些线程,有任务需要使用线程的时候就往线程池里抓线程对象出来使用.线程池里的线程能够重复使用,所以在资源上 ...

  3. kevin的黎明十分

    今天在搜索struts2的相关知识的时候,博客园让我提起了兴趣.其间看到了hongton同学的分享,感觉受益颇深!所以今天我加入了博客园,希望自己以后能在这个大家园中分享知识,收获人生!  即兴之下, ...

  4. PhpStrom如何安装主题?(总结三种不同格式安装方法)

    在网上搜了很多都是不怎么齐全的方法,在这里我总结一下PhpStrom的三种不同格式的安装方法,以后就不用再去网上搜直接看我自己的博客就知道了.以下默认为Windows系统,Linux现在暂时还没更新. ...

  5. (转)WebSphere MQ基础命令

    --查看MQ版本-- dspmqver --查看队列状态--dspmq --创建队列管理器--crtmqm -q ECIS_QM --删除队列管理器--dltmqm ECIS_QM --启动队列管理器 ...

  6. [js] post 方式打开新窗口

    一.前因 一般我们是用 window.open(url,name,params); 打开新窗口, url 会携带一些参数, 但存在参数过多,引发url 过长截断,无法打开正确窗口, 所以我们需要使用 ...

  7. 【逻辑漏洞】基于BurpSuite的越权测试实战教程

    一.什么是越权漏洞?它是如何产生的? 越权漏洞是Web应用程序中一种常见的安全漏洞.它的威胁在于一个账户即可控制全站用户数据.当然这些数据仅限于存在漏洞功能对应的数据.越权漏洞的成因主要是因为开发人员 ...

  8. js实现轮播图效果(附源码)--原生js的应用

    1.js实现轮播图效果 <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

  9. SharePoint 2016 配置工作流环境

    前言 SharePoint 2016 默认创建工作流的时候,工作流平台只包含2010版本,如果想要使用状态机工作流,需要单独安装workflow manager 1.0才可以,下面,我们为大家介绍一下 ...

  10. 统一代码风格工具——editorConfig

    前面的话 在团队开发中,统一的代码格式是必要的.但是不同开发人员的代码风格不同,代码编辑工具的默认格式也不相同,这样就造成代码的differ.而editorConfig可以帮助开发人员在不同的编辑器和 ...