options request
跨域与http请求之options
跨域/跨源
起始
同源策略:
Same Origin Policy, 同源策略是一种约定,是浏览器最核心、最新基本的安全功能。Web是构建在同源策略基础之上,而浏览器是针对同源策略的一种实现。【From 百科】
同源策略也是一种同来隔离潜在恶意文件的一种关键的安全机制. 【From MDN】
同源/同域:
1 | •协议相同 |
其它的可能存在嵌入跨域资源的 HTML
标签:
标签🏷 | 示例 | 说明 |
---|---|---|
script | script src=”…”> | 标签嵌入跨域脚本。语法错误信息只能在同源脚本中捕捉到 |
link | link rel=”stylesheet” href=”…”> | 标签嵌入CSS。由于CSS的松散的语法规则,CSS的跨域需要一个设置正确的Content-Type消息头 |
img | img src=”….”> | 支持的图片格式包括PNG,JPEG,GIF,BMP,SVG,… |
video/audio | video src=”….” /> | 多媒体资源 |
object/embed/applet | ||
frame/iframe | frame src=”…”> | 站点可以使用X-Frame-Options消息头来阻止这种形式的跨域交互 |
因为 同源策略
的原因,通常情况下,浏览器端进行 Ajax
请求时只能进行同源请求(即:当前域下的Ajax请求只能请求当前域对应的后端接口/资源)
跨域特点/造成的问题
通常跨域会有一下特点:
1 | •跨域是浏览器同源策略限制,所以在浏览器之外是没有跨域问题的,所以有时候我们用Charles等抓包工具能够看到返回,但实际上是有跨越问题的; |
跨域解决方案
1 | •JSONP |
最常用的就前2中 JSONP
和 CORS
了。
JSONP解决跨域
作用: 实现跨域读取数据。
JSONP
的全英文:JSON with Padding
, 单次padding
的中译文:衬垫、衬料;废话;赘语。 在此处直译为 衬垫比较接近其本意,那么就可以译为:一个附加性的、陪衬性的JSON。
一般情况下,我们在自己的项目中引用其他的、第三方的或是CDN上的JS等脚本资源时不会存在跨域(源)问题,可以自由加载并执行不同域名下的脚本。
前端
1 |
|
http://www.xxx/xxx/xx/jsonp.php?jsoncallback=callbackFunction
返回数据
1 | callbackFunction(["customername1","customername2"]) |
在前端页面里首先预定义了一个函数名为: callbackFunction
, 当加载脚本\<script type="text/javascript" src="http://www.xxx/xxx/xx/jsonp.php?jsoncallback=callbackFunction"></script>
完成后,返回的就是如上数据,那么此时我们预定义的这个函数 callbackFunction
就会被调用,同时返回的数据 ["customername1","customername2"]
被当做这个函数的参数传入并执行该函数。
浏览器执行 脚本 \<script type="text/javascript" src="http://www.xxx/xxx/xx/jsonp.php?jsoncallback=callbackFunction"></script>
时回去请求这个资源并向后台传递了一个参数 jsoncallback
其value为 callbackFunction
。
假设后端为PHP
1 |
|
这样浏览器执行 script
脚本完毕后就可以获取到响应的数据,然后去渲染等.
使用JSONP模式的重要前提: 前后端要 事先约定好 包裹的函数名即callback名称; 且JSON的请求方式只能为 GET 请求; 同时若不对传递的包裹函数变量jsoncallback进行转义的话是很容易造成XSS攻击
CORS解决跨域
CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing);允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
详细参考:
http://www.ruanyifeng.com/blog/2016/04/cors.html
restful API
通常有 PUT
GET
POST
DELETE
HEAD
OPTIONS
1 | REST中又提出了几种其它类型的请求方式,汇总起来有六种:GET、POST、PUT、DELETE、HEAD、OPTIONS。 |
说说其中的options
请求:
服务器端已支持跨域请求,但是浏览器端进行跨域请求时,会首先发出options请求,服务端会返回相应的response并并告诉浏览器是否允许跨域请求(access-control-allow-origin头为*或者和当前域名一致的话,才会进入第二段的真正请求),允许,那浏览器就接着进行请求,否则就抛出错误(xxx. Xmlhttprequest not allowed 。。。。)
版权声明:
本文由Lomo创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,
转载请注明作者及出处,本文作者为Lomo,本文标题为options request.