当协议、域名、端口中任一个不同时产生跨域

CORS 跨域资源共享(Cross-origin resource sharing)

参考资料https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

CORS的两种请求方式

简单请求

满足以下条件

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

    • HEAD
    • GET
    • POST
  2. HTTP的头信息不超出以下几种字段
    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type:只限于三个值(application/x-www-form-urlencoded、multipart/form-data、text/plain)

流程

浏览器在header中增加一个Origin字段,该字段说明本次请求来自哪个源。服务器根据这个值决定是否同意这次请求。如果不允许,返回一个正常的HTTP响应,浏览器根据返回的响应的头信息中是否包含Access-Control-Allow-Origin字段判断是否成功

非简单请求

不满足简单请求的条件

流程

浏览器发送一个方法为OPTIONS的预检请求,服务器根据请求头中的Access-Control-Allow-*等字段判断是否允许跨域请求。若服务器拒绝的跨域请求,会返回一个正常的HTTP响应,但是没有任何CORS相关的信息字段。浏览器会认定服务器不同意预检请求,触发跨域错误。

可以通过服务端设置Access-Control-Max-Age字段来避免频繁发送预检请求,单位:秒

服务端处理机制

  1. 首先查看HTTP头部有无Origin字段
  2. 如果没有,或者不允许,当成普通请求
  3. 如果有且是允许的,再看是否是preflight(method=OPTIONS)
  4. 如果不是preflight(简单请求),返回Allow-Origin, Allow-Credential等字段,并返回正常内容
  5. 如果是preflight(非简单请求),返回Allow-Headers, Allow-Methods

服务端的CORS解决跨域问题

在Controller上加注解 @CrossOrigin

可配置项

@AliasFor("origins")
String[] value() default {}; @AliasFor("value")
String[] origins() default {}; String[] allowedHeaders() default {}; String[] exposedHeaders() default {}; RequestMethod[] methods() default {}; String allowCredentials() default ""; long maxAge() default -1L;

统一配置

@Configuration
public class WebMvcConfig { @Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");//允许任何域名
config.setAllowCredentials(true);//允许Cookie
config.addAllowedMethod("*");//允许任何方法
config.addAllowedHeader("*");//允许任何头
config.setMaxAge(1800l);//设置预检请求保持时间,避免频繁发送预检请求 UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config); return new CorsFilter(configSource);
}
}

其他解决方案

vue cli3

项目根目录下新建vue.config.js文件

proxy: {
"/api": {
target: "http://localhost:8080/KeyWord/",// 要访问的接口域名
}
}

在请求前加上/api/即可,详细参考Vue CLI3官方文档https://cli.vuejs.org/zh/config/#devserver-proxy

Nginx配置(没实践过,自行百度)

服务端 CORS 解决跨域的更多相关文章

  1. 14 微服务电商【黑马乐优商城】:day06-使用nginx反向代理并掌握cors解决跨域

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...

  2. Spring Boot中通过CORS解决跨域问题

    今天和小伙伴们来聊一聊通过CORS解决跨域问题. 同源策略 很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略. 同源策略是由Netscap ...

  3. Spring Boot2 系列教程(十四)CORS 解决跨域问题

    今天和小伙伴们来聊一聊通过CORS解决跨域问题. 同源策略 很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略. 同源策略是由 Netsca ...

  4. 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域

    原文:一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 一步一步学习SignalR进行实时通信\_3_通过CORS解决跨域 SignalR 一步一步学习SignalR进行实时通信_3_ ...

  5. 配置CORS解决跨域调用—反思思考问题的方式

    导读:最近都在用一套完整的Java EE的体系做系统,之前都是用spring框架,现在弄这个Java EE,觉得新鲜又刺激.但,由于之前没有过多的研究和使用,在应用的过程中,也出现了不少的问题.累积了 ...

  6. Django使用jsonp和cors解决跨域请求问题

    1.使用jsonp的方式解决跨域请求的问题 我启动两个django项目,然后使用的端口不一样,在项目1中通过ajax发请求给项目2,然后接受项目2发送过来的数据 先看项目1的ajax的代码 $(&qu ...

  7. 使用cors解决跨域遇到浏览器发出options嗅探

    前言: 本地开发起的服务器,通过修改hosts文件设置域名映射到本地,接口在测试环境 1. 服务器端设置cors, 配置access-control-allow-origin 头部 使用蚂蚁金服的up ...

  8. JSONP、CORS解决跨域问题

    一.为什么会有跨域问题? 是因为浏览器的同源策略是对ajax请求进行阻拦了,但是不是所有的请求都给做跨域,对href属性都不拦截. 二.解决跨域问题的两种方式 JSONP CORS 三.JSONP 先 ...

  9. 后端CORS解决跨域问题

    一 . 为什么会有跨域问题 是因为浏览器的同源策略是对ajax请求进行阻拦了,但是不是所有的请求都给做跨域,像是一般的href 属性,a标签什么的都不拦截. 二 . 解决跨域的方法 解决跨域有两种方法 ...

随机推荐

  1. IO模型之BIO代码详解及其优化演进

    一.BIO简介 BIO是java1.4之前唯一的IO逻辑,在客户端通过socket向服务端传输数据,服务端监听端口.由于传统IO读数据的时候如果数据没有传达,IO会一直等待输入传入,所以当有请求过来的 ...

  2. 【前端适配】vw单位移动端适配方案

    近些年移动端的强势崛起,导致移动端适配越来越重要,个人之前一直使用的是rem进行适配,但是发现并不是非常完美,给力的是大漠老师写了一篇<如何在Vue项目中使用vw实现移动端适配>,比较完美 ...

  3. js调用正则表达式

    //验证是否为正整数 function isPositiveInteger(s) { var re = /^[0-9]+$/; return re.test(s); } if (exchangeCou ...

  4. 第十七篇:WEB服务器之HTTP协议

    本篇主要为为了实现WEB服务器,其中包含了HTTP协议的理解,以及TCP的三次握手.四次挥手等方面相关知识,同时还包含了关于web浏览器与服务器之间的通信过程. 一.web浏览器 通常在我们上网时会在 ...

  5. python之命名空间与作用域

    一.命名空间与作用域 在命名空间中的名称能将任何python对象作为值,在不同的命名空间中相同的名称可以与不同的对象相关联.但是,如果存在名称解析协议,则多个命名空间可以一起工作来解析名称.也就是说, ...

  6. [Git]checkout 指定版本

    Task:知道commit号,如何checkout 指定版本 1. 切换到master: git checkout master 2. 下载最新代码:  git pull 3. 下载head: git ...

  7. webpack 配置react脚手架(四):路由配置

    1. 由于 react-router 是集成了 react-router-dom 和 react-router-native的一起的,所以这里要使用的是 react-router-dom, 2. 安装 ...

  8. python练习题(三)

    题目: 一.二选一 1.每个区生成1个符合身份证规则的身份证号码 2.随机生成10个符合身份证规则的身份证号码 二.要求: 1.身份证属于南京市 2.出生日期为1980-1-1 至 2019-8-1的 ...

  9. Python3入门与进阶【笔记】

    1.二.八.十六进制转十进制:int('10', base=2).int('10', base=8).int('10', base=16): 2.八.十.十六进制转二进制:bin(0o+xxx).bi ...

  10. Django REST framework+Vue 打造生鲜电商项目(笔记六)

    (部分代码来自https://www.cnblogs.com/derek1184405959/p/8836205.html) 九.个人中心功能开发 1.drf的api文档自动生成 (1) url #d ...