文档章节

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

wangkang80
 wangkang80
发布于 2017/06/01 11:00
字数 1153
阅读 1497
收藏 9
点赞 0
评论 0

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
粉丝 342
博文 22
码字总数 34117
作品 3
浦东
高级程序员
UDF 集成样例--udf-sample

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

wangkang80 ⋅ 2017/08/27 ⋅ 0

SpringBoot 实现前后端分离的跨域访问(CORS)

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

Jokey2017 ⋅ 2017/11/14 ⋅ 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

SpringMvc解决跨域问题

前言:今天解决js跨域,搞了一下午,呜呜,以下是我整理的一些解决方法 介绍: 跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请...

王念博客 ⋅ 2016/06/08 ⋅ 0

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

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

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

CORS with Spring Boot and Spring Security

Spring 对 CORS 的支持 在这篇文章 spring 说明了自己在 Spring MVC 中所提供的 CORS 的支持。文中提到了三种 Spring 支持 CORS 的方式: 对于单个方法的跨域支持,可以使用 的注解实现,这种...

eisenxu ⋅ 2017/11/08 ⋅ 0

guerlab_net/guerlab-spring

guerlab-spring spring 扩展工具集 maven仓库地址 net.guerlabguerlab-spring2.0.0-SNAPSHOT 子项目列表 子项目 说明 guerlab-spring-cloud-starter cloud项目常用依赖包 guerlab-spring-com......

guerlab_net ⋅ 05/20 ⋅ 0

Java Web应用中支持跨域请求

由于工程合作开发的需要,后台的应用要能支持跨域访问,但是在这个跨域访问“时好时坏”,我们这帮屌丝所知道的就是加上两个jar包,然后声明一下Filter,感觉很简单的有没有!!感觉自己很牛...

lmy86263 ⋅ 2016/06/21 ⋅ 0

书签

数据库事务隔离级别 - 理解事务的4种隔离级别 20180111 dubbo - Dubbo超时重试机制带来的数据重复问题 20180111 跨域 跨域资源共享 CORS 详解 SpringMVC CORS SpringMVC开启CORS支持 | 2018...

4rnold ⋅ 01/05 ⋅ 0

Spring MVC通过CROS协议解决跨域问题

现在接手学校网络中心的一个项目,根据团队成员的实际情况以及开发需要,老师希望做到前后端完全分离。后台使用java提供restful API 作为核心,前台无论PC或者移动端可以共用一个核心。前期解...

vstaryw ⋅ 2016/07/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 32分钟前 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 41分钟前 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 50分钟前 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部