文档章节

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

wangkang80
 wangkang80
发布于 2017/06/01 11:00
字数 1153
阅读 1929
收藏 10

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同一域名,不同协议 跨域

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

然后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 = "com.egridcloud.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规则

com.egridcloud.cors.config.demo.mapping=/**
com.egridcloud.cors.config.demo.allowCredentials=
com.egridcloud.cors.config.demo.allowedOrigins=
com.egridcloud.cors.config.demo.allowedMethods=
com.egridcloud.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)的跨域设置


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

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

© 著作权归作者所有

共有 人打赏支持
wangkang80
粉丝 355
博文 22
码字总数 34117
作品 3
浦东
高级程序员
UDF 集成样例--udf-sample

UDF 基于spring boot / spring cloud 的基础项目,脚手架,主要用于学习和实践 按照spring boot的思想,将各个不同的功能按照starter的形式拆分开来,做到灵活组合 物理架构示意 CI & CD 示意 代...

wangkang80
2017/08/27
344
0
SpringBoot 实现前后端分离的跨域访问(CORS)

一、基本介绍 CORS是一种访问机制,英文全称是Cross-Origin Resource Sharing,即我们常说的跨域资源共享,通过在服务器端设置响应头,把发起跨域的原始域名添加到Access-Control-Allow-Orig...

Jokey2017
2017/11/14
0
0
Java服务端Cors跨域资源共享配置,解决与Spring Security冲突引起的问题

(一) CORS介绍 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 re...

hhjian
2017/11/01
0
0
spring boot cors 允许跨域请求

spring boot cors 实现 官方文档:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework 有三种方法,可以通过在程序中通过代码,允许跨域请求。 1 声明一个CORS过滤器 统一...

pding
05/22
0
0
重拾后端之Spring Boot(五) -- 跨域、自定义查询及分页

重拾后端之Spring Boot(一):REST API的搭建可以这样简单 重拾后端之Spring Boot(二):MongoDb的无缝集成 重拾后端之Spring Boot(三):找回熟悉的Controller,Service 重拾后端之Sprin...

接灰的电子产品
2017/04/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
8分钟前
0
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
5
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
3
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部