转 小辉_Ray CORS(跨域资源共享)

news/2024/7/4 7:24:21

前言:上一篇文章在写如何使用JSONP实现跨域请求的时候,偶然间提到CORS,即Cross-Origin Resource Sharing(跨域资源共享)。虽然前些天也看了一下CORS相关的文章,但是今天兴趣一来还是亲自地写篇博客来研究一下吧。如果是关于技术的资料,我还是比较喜欢看维基百科。至于百度百科,平常查查生活资料还行。让我们先看看比较官方的名词解释吧,请不要吐槽我的翻译(⊙o⊙)…。

解释:

  Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources (e.g. fonts, JavaScript, etc.) on a web page to be requested from another domain outside the domain from which the resource originated.[1]

A web page may freely embed images, stylesheets, scripts, iframes, videos and some plugin content (such as Adobe Flash) from any other domain. However embeddedweb fonts and AJAX (XMLHttpRequest) requests have traditionally been limited to accessing the same domain as the parent web page (as per the same-origin security policy). "Cross-domain" AJAX requests are forbidden by default because of their ability to perform advanced requests (POST, PUT, DELETE and other types of HTTP requests, along with specifying custom HTTP headers) that introduce many cross-site scripting security issues.

CORS defines a way in which a browser and server can interact to safely determine whether or not to allow the cross-origin request.[2] It allows for more freedom and functionality than purely same-origin requests, but is more secure than simply allowing all cross-origin requests. It is a recommended standard of theW3C.[3]

原文解释来自维基百科

我的翻译:

  跨域资源共享是一个允许网页上受限制的资源(如字体,JavaScript等)向本域名同源资源外的其他域名请求的机制。

  一个网页也许能随意地嵌入任何一个域名中的图片、样式、脚步、框架、视频和一些插件(例如Adobe Flash)等内容。但是嵌入的网络字体和AJAX请求在传统上被限制于只能在主页的同一域名下访问(按照同源安全政策)。跨域的AJAX请求默认是被禁止的,因为它们能连同指定的自定义HTTP请求头,一起执行会带来很多跨域脚步安全问题的高级请求(如POST,PUT,DELETE和其他类型的HTTP请求)。

  CORS规定了一种方法,通过这种方法浏览器和服务器之间能够安全地决定是否允许跨域请求。它比单纯的同源请求给予了更大的自由度以及功用性,但不是简单的允许所有跨域请求会更安全一些。这是W3C的一个推荐标准。

 实现:

  访问方法:在服务端使用'Access-Control-Allow-Origin' header进行配置。

  以下客户端以AJAX为例,服务端以PHP为例.

  本机域名1:http://www.chengguanhui.com,本机域名2:http://www.goingic.com,请求域名是:http://www.happywzq.com。

复制代码
 1 var main = document.getElementById("main");2         var btn = document.getElementById("btn");3         var ajax = new XMLHttpRequest();4         btn.onclick = function(){    5             ajax.onreadystatechange=function()6                   {7                   if (ajax.readyState==4 && ajax.status==200){8                        main.innerHTML=ajax.responseText;9                 }
10             }
11         ajax.open("POST","http://www.happywzq.com/xiaohui/index.php",true);
12         ajax.send();
13         }
复制代码
1 <?php 
2     //header("Access-Control-Allow-Origin:*");
3     header("Content-type:text/html;charset=utf-8");
4     echo "我在测试CORS!";
5  ?>

  情景一:不加Access-Control-Allow-Origin文件头。

图一为跨域访问,图二为本域访问。结果很明显,不设置允许访问源时,其他域名是无法请求的,在当前域名下的文件成功访问。


 

  情景二:将PHP注释去掉,添加Access-Control-Allow-Origin:*文件头,开放任意域名(不建议使用这种方式)。

结果是,我这边的两个主机的域名都能向happywzq下的文件发起请求,并成功返回文本。


 

  情景三:将PHP允许源文件头改为'Access-Control-Allow-Origin:http://www.chengguanhui.com',即只对我的域名允许请求。

结果很明显,用我的域名1时可以访问,但用域名2时就请求不了,无法返回数据了。

兼容性:

  在兼容性方面,CORS在IE9+,FF3.5+,Safari4.0+等浏览器上表现良好。以下这张图是从别的地方拿过来的(如有侵权本人立即删除并公开致歉),但是我测试了一下IE6跟IE8,结果均没有任何反应,且没报错。至于IE8,网上有人说可以实现CORS,但是写法不一样。这个暂时没有研究过,可能是所谓的部分支持,又或许需要写兼容吧。好了,时间关系,先回家吃饭了,明天再测试IE8的情况吧。

图为各浏览器对于CORS的支持情况,图片来源:蒋宇捷,数据来源:http://caniuse.com/cors。

 

转载于:https://www.cnblogs.com/qilinge/p/4963080.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/15031.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

java timer.schedule如何控制执行次数_Java 分布式任务调度平台:PowerJob 快速开始+配置详解...

本文适合有 Java 基础知识的人群作者&#xff1a;HelloGitHub-Salieri引言HelloGitHub 推出的《讲解开源项目》[1]系列。项目地址&#xff1a;https://github.com/KFCFans/PowerJobPowerJob 的设计目标为企业级的分布式任务调度平台&#xff0c;即成为公司内部的调度中间件。整…

kali linux samba,Kali Linux 渗透测试:SMB、SMTP扫描工具(14)

一、SMB扫描工具SMB(Server Message Block)协议&#xff0c;服务消息块协议。最开始是用于微软的一种消息传输协议&#xff0c;因为颇受欢迎&#xff0c;现在已经成为跨平台的一种消息传输协议。同时也是微软历史上出现安全问题最多的协议。它的实现复杂&#xff0c;并且默认在…

.net new一个类为什么报空指针_谈谈.NET对象生命周期

不用程序员操心的堆 — 托管堆程序在计算机上跑着&#xff0c;就难免会占用内存资源来存储在程序运行过程中的数据&#xff0c;我们按照内存资源的存取方式将内存划分为堆内存和栈内存。栈内存通常使用的场景是&#xff1a;对存取速度要求较高且数据量不大。典型的栈内存使用的…

kvm上添加万兆网卡_部署kvm(二)

6.管理KVM虚拟机virsh list//查看 正在运行virsh list --all//查看所有id 名称 状态centos7.3 runningvirsh start 名字 //启动virsh shutdown 名字 //关机virsh destroy 名字 //强制关机virsh autostart 名字 //自动启动virsh suspend 名字 //挂起virsh resume 名字 //恢复vir…

python包 wget_Python数据科学“冷门”库

原标题 | Lesser Known Python Libraries for Data Science作者 | Parul Pandey译者 | CONFIDANT&#xff08;福建师范大学&#xff09;、Seabiscuit、唐里、david95&#xff08;研发工程师&#xff09;Python是一门神奇的语言。事实上&#xff0c;它是世界上发展最快的编程语言…

第十二周 11.15-11.21

11.15 补个BC。 HDU 5565 Clarke and baton 没太懂题解怎么搞。反正挺暴力过了。 1 #include <iostream>2 #include <cstdio>3 #include <map>4 #include <vector>5 #include <algorithm>6 using namespace std;7 typedef long long LL;8 const …

android 设置setmultichoiceitems设置初始化勾选_阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?...

集合是Java开发日常开发中经常会使用到的&#xff0c;而作为一种典型的K-V结构的数据结构&#xff0c;HashMap对于Java开发者一定不陌生。关于HashMap&#xff0c;很多人都对他有一些基本的了解&#xff0c;比如他和hashtable之间的区别、他和concurrentHashMap之间的区别等。这…

w ndows连接USB不正常,Raspberry Pi Zero W 连接电脑 – 针对Windows 10 缺少RNDIS驱动

在网上有很多关于Raspberry Pi Zero连接电脑的帖子&#xff0c;但是发现在windows 10 系统上发现没有发现RNDIS 驱动&#xff0c;这个驱动在其他系统上会自动安装&#xff0c;但是在windows 10 上显示的是一个串口&#xff0c;并不是RNDIS 设备&#xff0c;RNDIS是一个通过USB的…