php cros跨域处理,CORS跨域问题解决方案
跨域问题主要是由于浏览器同源策略限制引起,简单来说,就是只相信自己人,不相信外人,只响应同域名发来的http请求,不相信其他域名发来的http请求。好处是减少上当受骗的几率,缺点是不符合webapi的大趋势,api访问会受限。
浏览器同源策略
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
它的核心就在于它认为自任何站点装载的信赖内容是不安全的。浏览器只被允许访问来自同一站点的资源,而不是那些来自其它站点可能怀有恶意的资源。
同源是指:域名、协议、端口相同。
跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
CORS(跨域资源共享)
CORS(Cross-origin resource sharing,跨域资源共享)是一个 W3C 标准,定义了在必须访问跨域资源时,浏览器与服务器应该如何沟通。CORS 背后的基本思想,就是使用自定义的 HTTP 头部(origin、method)让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。
CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于 IE10。
整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS 通信与同源的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求(非简单请求),但用户不会有感觉。
因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨源通信。
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
只要同时满足以下两大条件,就属于简单请求。
1、请求方法是以下三种方法之一:HEAD、GET、POST
2、HTTP的头信息不超出以下几种字段:Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不同时满足上面两个条件,就属于非简单请求。
浏览器对这两种请求的处理,是不一样的。
简单请求
在请求中需要附加一个额外的 Origin 头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部信息来决定是否给予响应。例如:Origin: http://www.abc.com
如果服务器认为这个请求可以接受,就在Access-Control-Allow-Origin头部中回发相同的源信息(如果是公共资源,可以回发 * )。例如:Access-Control-Allow-Origin:http://www.abc.com
没有这个头部或者有这个头部但源信息不匹配,浏览器就会驳回请求。正常情况下,浏览器会处理请求。注意,请求和响应都不包含 cookie 信息。
如果需要包含 cookie 信息,ajax 请求需要设置 xhr 的属性 withCredentials 为true,服务器需要设置响应头部Access-Control-Allow-Credentials: true。
服务器需要做的工作:
1.设置允许访问本接口的网址
2.设置允许访问本接口的请求类型
3.设置允许访问本接口的头
非简单请求
浏览器在发送真正的请求之前,会先发送一个 Preflight 请求给服务器,这种请求使用 OPTIONS方法,发送下列头部:
Origin:与简单的请求相同。
Access-Control-Request-Method: 请求自身使用的方法。
Access-Control-Request-Headers: (可选)自定义的头部信息,多个头部以逗号分隔。
例如:
1、浏览器先发送一个Option请求到服务器
Origin: http://www.abc.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: token
2、发送这个请求后,服务器可以决定是否允许这种类型的请求。服务器通过在响应中发送如下头部与浏览器进行沟通:
Access-Control-Allow-Origin:与简单的请求相同。
Access-Control-Allow-Methods: 允许的方法,多个方法以逗号分隔。
Access-Control-Allow-Headers: 允许的头部,多个方法以逗号分隔。
Access-Control-Max-Age: 应该将这个 Preflight 请求缓存多长时间(以秒表示)。
例如:
Access-Control-Allow-Origin: http://www.abc.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: token
Access-Control-Max-Age: 1728000
一旦服务器通过 Preflight 请求允许该请求之后,以后每次浏览器正常的 CORS 请求,就都跟简单请求一样了。
预请求只在第一次发生,检测通过后,后面请求时不会再发出Option请求
服务器需要做的工作:
1.设置允许访问本接口的网址
2.设置允许访问本接口的请求类型
3.设置允许访问本接口的头
优点
CORS 通信与同源的 AJAX 通信没有差别,代码完全一样,容易维护。
支持所有类型的 HTTP 请求。
缺点
存在兼容性问题,特别是 IE10 以下的浏览器。
第一次发送非简单请求时会多一次请求。
案例一:
这就是个简单请求
$ajax({
url:"http://www.abc.com/api.php?action=getlogo",
data:{siteid:123}
})
案例二:
这是一个非简单请求,因为headers中加入了自定义头
图片发自简书App
php cros跨域处理,CORS跨域问题解决方案相关推荐
- php跨域资源共享,CORS 跨域资源共享
CORS (Cross-Origin Resource Sharing) 跨域资源共享 为什么需要 CORS 首先,跨域指的是同一个域名下的资源,同时要注意域名与子域名,比如 developers.e ...
- nginx解决浏览器跨域问题_Nginx解决前端跨域问题 CORS跨域配置
最近连续两个朋友问我跨域相关问题,我猜想可能不少朋友也遇到类似问题,我打算写个博客聊一下我实际使用的配置, 先说明一下,我并不太了解这配置,没精力去了解太多,但我觉得其中有一些关键的小注意点,可能有些 ...
- Web API 实现JSONP或者安装配置Cors跨域
前言 照理来说本节也应该讲Web API原理,目前已经探讨完了比较底层的Web API消息处理管道以及Web Host寄宿管道,接下来应该要触及控制器.Action方法,以及过滤器.模型绑定等等,想想 ...
- Spring Boot CORS跨域资源共享实现方案
同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能 同源策略限制cookie 等信息的跨源网页读取,可以保护本地用户信息 同源策略限制跨域 aja ...
- fetch ajax cros,由 Fetch 跨域 看 CORS
最近在看 react 获取服务器数据时, 看到了一新的 API fetch, 上手来用了用,觉得十分好用.但是使用的过程中遇到了一些问题,还是决定整体的记录下. fetch 类似于 Ajax, 区别自 ...
- CORS 跨域 实现思路及相关解决方案(转:http://www.cnblogs.com/sloong/p/cors.html)
本篇包括以下内容: CORS 定义 CORS 对比 JSONP CORS,BROWSER支持情况 主要用途 Ajax请求跨域资源的异常 CORS 实现思路 安全说明 CORS 几种解决方案 自定义CO ...
- Cors跨域(一):深入理解跨域请求概念及其根因
Talk is cheap. Show me the money. 前言 你好,我是YourBatman. 做Web开发的小伙伴对"跨域"定并不陌生,像狗皮膏药一样粘着几乎每位同学 ...
- nginx处理cros跨域遇到的各种问题及解决方案,以及https配置和浏览器https不安全问题处理
文章目录 前言 前言一.什么是跨域? 前言二.跨域产生的条件? 跨域处理常用的两种办法 一.springboot如何处理跨域问题? 1.1 controller中单独配置 1.2 在@configat ...
- CORS跨域资源共享 1
1. 接口的跨域问题 (1)编写的 GET 和 POST 接口,存在一个很严重的问题:不支持跨域请求. 解决接口跨域问题的方案主要有两种: ① CORS(主流的解决方案, 推荐使用 ) ② JSONP ...
最新文章
- 作为计算机专业的你,这些点你命中了哪些?
- 如何修复java.lang.UnsupportedClassVersionError:不支持的major.minor版本
- 电容触摸屏GT911、GT928、GT9147的使用
- 简单的ALV显示例子
- ubtunu打开firefox_ubuntu中火狐浏览器问题(也许是)
- 网络爬虫--21.Scrapy知识点总结
- SQL核心语句(非常实用的几个技巧)
- 随想录(elf文件)
- c#事件的发布-订阅模型_NET Core 3 WPF MVVM框架 Prism系列之事件聚合器
- Google 出售 Performics
- 190102每日一句
- 编程题_排列组合问题
- 腾讯6W月薪架构师能力曝光!微信架构为什么是史上最值钱的IM架构?
- 用python简单的判断闰年,输出当前月份是多少天
- 情感天地 - 自作诗词 - 《船夫奇恋曲》
- Stata字符型与数值型数据的转换——上市公司证券代码字符型与数值型的互换
- javascript实现根据身份证号读取相关信息
- STM32F411RE项目开发-1-点亮LD2小灯
- java设计帐号密码_怎样用java设置帐号和密码
- 铁匠smith_铁匠镇的皱纹地图