CORS跨域问题

跨域问题简介

跨域资源共享(Cross-origin resource sharing, CORS)是用于让网站资源能被不同源网站访问的一种安全机制,这个机制由浏览器与服务器共同负责,浏览器在其中扮演最重要的角色。

同源

协议相同(httphttps)、域名相同、端口相同就是同源。

同源限制了B网站获取到非同源的A网站保存在浏览器的Cookie、LocalStorage、IndexDB、DOM、AJAX请求。当A网站的网页内有跨域请求且A网站后端并未添加跨域请求头,浏览器将拦截该跨域请求。

请求过程

当浏览器发出特定不安全的HTTP和Ajax请求时,CORS机制要求浏览器首先需要发送一个HTTP OPTIONS预检请求用于检查服务器是否批准来自该地址的请求并指定是否接收认证信息(例如Cookies等),浏览器将遵循服务器的限制正式请求的情况。出于安全考虑,如果跨域请求被拒绝,错误将只会返回到浏览器控制台内,JavaScript代码不会接收到错误信息。

不会触发OPTIONS预检请求的条件是:

  • 请求方法为GET、HEAD、POST
  • 请求头安全Accept、Accept-Language、Content-Language、Content-Type(仅限于text/plain、multipart/form-data、application/x-www-form-urlencoded)、DPR、Downlink、Save-Data、Viewport-Width、Width

不发出预检请求的例子

下面是一个不需要发送预检请求的从http://foo.example网站的网页或JavaScript访问http://bar.example请求的简化版,Origin请求头用于标志请求来源

GET /resources/public-data/ HTTP/1.1
Origin: http://foo.example

以下是支持CORS的http://bar.example返回内容的简化版,Access-Control-Allow-Origin头标记该网站可以被跨域访问的源,*代表可以被任意源访问,如果仅允许来自http://foo.example的请求则改为http://foo.example

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *

会发出预检请求的例子

下面是一个需要发送预检请求的从http://foo.example网站的网页或JavaScript访问http://bar.example请求的简化版,下面两个头文件内容是预检请求与其返回内容

OPTIONS /resources/post-here/ HTTP/1.1
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400

下面两个头文件内容是实际请求的内容

POST /resources/post-here/ HTTP/1.1
Host: bar.other
X-PINGOTHER: pingpong
Origin: http://foo.example
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://foo.example

身份凭证的特别处理

当同源时,浏览器请求可以带有Cookie等身份认证信息,但是如果跨源请求需要携带身份凭证,则需要为XMLHttpRequestFetch API进行额外设置。但是只要需要前端进行跨源请求时携带用户凭证,服务器设置的Access-Control-Allow-Origin就不能为*而需要设置为允许跨域请求的来源域名

跨域相关HTTP头

响应中的头

响应头内容需要在服务器端进行定义,具体定义方法需要根据后端使用语言、框架不同有所改变。

  • Access-Control-Allow-Origin: <origin http address> | *:设置允许跨域访问该资源的域名,设置为通配符*时凭证信息将不会被携带
  • Access-Control-Expose-Headers: <headers>[, <headers>]*: 设置浏览器可访问请求头的白名单,设置之后getResponseHeader()就可访问默认白名单外的请求头
  • Access-Control-Max-Age: <seconds>:指定OPTIONS预检请求最长有效时间
  • Access-Control-Allow-Credentials: true:指定当跨源身份凭证发送时浏览器是否可以读取返回内容,如果用在预检请求上,将决定浏览器在发出正式请求时是否携带有凭证,如果请求无预检请求例如GET,则该响应会被忽略且浏览器也不会将内容返回给网页
  • Access-Control-Allow-Methods: <method>[, <method>]*:指明实际请求所使用的HTTP方法
  • Access-Control-Allow-Headers: <field-name>[, <field-name>]*:指明了实际请求允许携带的首部字段

请求中的头

  • Origin: <origin>:指明了请求源站地址,不包含任何路径信息,只包含服务器名称
  • Access-Control-Request-Method: <method>:在预检请求上表明实际请求所使用的HTTP方法
  • Access-Control-Request-Headers: <field-name>[, <field-name>]*:在预检请求上表明实际所携带的首部字段

跨域问题CORS笔记的更多相关文章

  1. 跨域资源共享(CORS)问题解决方案

    CORS:Cross-Origin Resource Sharing(跨域资源共享) CORS被浏览器支持的版本情况如下:Chrome 3+.IE 8+.Firefox 3.5+.Opera 12+. ...

  2. asp.net core webapi之跨域(Cors)访问

    这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...

  3. ajax跨域请求学习笔记

    原文:ajax跨域请求学习笔记 前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可 ...

  4. 跨域资源共享CORS与JSONP

    同源策略限制: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说 ...

  5. rest_framework 跨域和CORS

      跨域和CORS   本节目录 一 跨域 二 CORS 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 跨域 同源策略(Same origin policy)是一种约定, ...

  6. Nginx配置跨域请求 CORS

    当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服 ...

  7. day 92 跨域和CORS

      跨域和CORS   本节目录 一 跨域 二 CORS 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 跨域 同源策略(Same origin policy)是一种约定, ...

  8. 跨域问题-cors

    什么是跨域如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨站请求.比如,使用 XMLHttpRequest 对象发起 HTTP 请求就必须遵守同源策略(same-origin policy). 具 ...

  9. springmvc springboot 跨域问题(CORS)

    官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html springmvc s ...

  10. springboot 项目跨域问题 CORS

    package com.example.demo.cors; import org.springframework.context.annotation.Bean; import org.spring ...

随机推荐

  1. Spring RSocket:基于服务注册发现的 RSocket 负载均衡

    简介: RSocket 作为通讯协议的后起之秀,核心是二进制异步化消息通讯,是否也能和 Spring Cloud 技术栈结合,实现服务注册发现.客户端负载均衡,从而更高效地实现面向服务的架构?这篇文章 ...

  2. 如何避免 Go 命令行执行产生“孤儿”进程?

    简介: 在 Go 程序当中,如果我们要执行命令时,通常会使用 exec.Command ,也比较好用,通常状况下,可以达到我们的目的,如果我们逻辑当中,需要终止这个进程,则可以快速使用 cmd.Pro ...

  3. [FAQ] 适用于 macOS / Arm64 (M1/M2) 的 VisualBox

      使用与 Windows.Linux.macOS 的x86架构的一般在下面地址中下载: Download VisualBox:https://www.virtualbox.org/wiki/Down ...

  4. [DApp] Moralis 生产阶段的服务安全设置 -锁定数据库

    Moralis 的基础设施数据库是使用的 MongoDB,其非常适合Dev阶段的快速开发. 如果进入生产环境,需要锁定数据库,防止任何用户可利用SDK向Mongo插入多余数据. 另外,Moralis ...

  5. 自制一个发送验证码的10秒倒计时js效果

    <template>     <div class="conten1">         <input class="code"  ...

  6. 『手撕Vue-CLI』添加自定义指令

    前言 经上篇『手撕Vue-CLI』添加帮助和版本号的介绍之后,已经可以在控制台中输入 nue --help 来查看帮助信息了,但是在帮助信息中只有 --version,--help 这两个指令,而 v ...

  7. Spark中的闭包引用和广播变量

    闭包引用 概念 所有编程语言都有闭包的概念,闭包就是在一个函数中引用了函数外的变量. Spark中,普通的变量是在Driver程序中创建的,RDD的计算是在分布式集群中的task程序上进行的.因此,当 ...

  8. 在IDEA中配置GitHub

    目录 在IDEA中配置GitHub 安装GitHub插件 账号授权 方法一:点击Add Account... 添加账号 方法二:使用token登录 共享到GitHub 查看文件变更列表 add文件 移 ...

  9. 什么是NASM

    什么是NASM NASM是一个汇编器的名称,全称是Netwide Assembler,支持x86与x64架构的CPU(注意不支持ARM架构). 我们知道,在x86和x64架构上有多个操作系统,比较流行 ...

  10. es请求方式调用

    Es基础 关系: ElasticSearch-> mysql index (索引)-> 数据库 Documents(文档) -> row(行) Fileds(字段)-> col ...