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. 第 9章 数据分析案例:Python 岗位行情

    第 9章 数据分析案例:Python 岗位行情 9.1 数据爬取 (1)打开某招聘网站首页 https://www.lagou.com,选择"全国站",在搜索栏输入 Python, ...

  2. Bilibili资深运维工程师:DCDN在游戏应用加速中的实践

    简介: bilibili资深运维工程师李宁分享<DCDN在游戏应用加速中的实践>从bilibili游戏应用的效果和成本入手,深入浅出地分享DCDN全站加速在游戏加速场景中的应用. 日前,云 ...

  3. 评审恩仇录——IDE也能做代码评审?

    简介: 云效Codeup推出了本地IDE插件端的评审,免除了黄药师来回华山的奔波之苦 现代科技公司的同事们平日一起交流开发规约和产品需求,肩上共同扛着业务发展和同行竞争的压力,这份还书贻剑的情谊如何能 ...

  4. EMR on ACK 全新发布,助力企业高效构建大数据平台

    ​简介: 阿里云 EMR on ACK 为用户提供了全新的构建大数据平台的方式,用户可以将开源大数据服务部署在阿里云容器服务(ACK)上.利用 ACK 在服务部署和对高性能可伸缩的容器应用管理的能力优 ...

  5. LlamaIndex 起步教程(本地模型)

    提示:确保您已先按照自定义安装步骤操作. 这是一个著名的"五行代码"起步示例,使用本地 LLM(大语言模型)和嵌入模型.我们将使用 BAAI/bge-small-en-v1.5 作 ...

  6. [Trading] 专业交易: 专业交易员和散户交易员的不同, 什么是专业交易员

    专业交易员可能用的是公司的钱或者自己的钱 有基本工资支持,散户用的是自己的钱 没有人提供工资来做交易. 目标不同,专业交易员的目的是增长投资账户和获得奖金,散户大部分是为了提取盈利收入而无法增长投资账 ...

  7. [FAQ] JS 时间戳格式化为 date

    拷贝使用,不用引入第三方库 function formatDate (date = 0, fmt = 'yyyy-MM-dd hh:mm:ss') { date = new Date(+date) i ...

  8. 校园圈子系统前后端安装开发app小程序h5

    四川掌上时代开发公司,作为一家专注于提供高质量软件解决方案的企业,在信息技术领域已经积累了丰富的经验和良好的声誉.位于中国四川省成都市,该公司不仅服务于本地市场,还将业务拓展到了全国乃至国际市场,与多 ...

  9. 更新package.json里所有模块

    安装该插件 cnpm install -g npm-check-updates 或者 npm install -g npm-check-updates 在有package.json的目录执行 npm- ...

  10. 开发环境需要同时安装2个nodejs版本

    由于同时有vue2和vue3的项目开发情况,vue2项目的nodejs版本是12,vue3项目在node12版本下运行不了,要求最低14版本,因此要用nvm同时安装和控制2个版本. 安装步骤: 1.卸 ...