一备畦、同源政策
?瀏覽器的同源政策限制了從一個(gè)源加載另外一個(gè)源的資源僵闯,它是瀏覽器的安全基石县好,所謂同源是指:
- 協(xié)議相同
- 域名相同
- 端口相同
?注意:IE的同源策略有兩個(gè)例外:
1.授信范圍:兩個(gè)相互之間高度互信的域名构哺,如公司域名捡絮,不遵守同源策略的限制
2.端口:IE未將端口號加入到同源策略的組成部分之中(如例四熬芜,在IE中則認(rèn)為同源)
?舉例說明:
以下與http://example.com:80/exam.html的同源性檢測
1.https://example.com:80/exam.html //不同源,協(xié)議不同
2.http://example2.com:80/exam.html //不同源福稳,域名不同
3.http://www.example.com:80/exam.html //不同源涎拉,域名不同
4.http://example.com:81/exam.html //不同源,端口不同 (此時(shí)IE中認(rèn)為同源)
5.http://example.com:80/exam2.html //同源的圆,協(xié)議鼓拧、域名、端口都同
二越妈、源的更改(document.domain)
?由于同源政策的影響季俩,即使是形如http://example.com:80/exam.html
與http://www.example.com:80/exam.html
也認(rèn)為是異源而無法請求,這里有一個(gè)簡單的方法可以完成他們之間的通信梅掠。
?瀏覽器允許將document.domain設(shè)置為其當(dāng)前域或其當(dāng)前域的超級域酌住,所以這里只需要將http://www.example.com:80/exam.html
的document.domain設(shè)置為example.com
即可。
三阎抒、CORS
?CORS全稱是"跨域資源共享"(Cross-origin resource sharing),它需要瀏覽器和服務(wù)器同時(shí)支持酪我,以實(shí)現(xiàn)AJAX的異源請求。其實(shí)現(xiàn)主要依靠服務(wù)器的設(shè)置挠蛉,即服務(wù)器HTTP響應(yīng)頭的“Access-Control-Allow-Origin”字段中加入允許跨域訪問的域名即可祭示,類似一個(gè)白名單的功能肄满。
以http://ken.com訪問http://qaq.com為例
服務(wù)器端:
response.setHeader("Access-Control-Allow-Origin","http://ken.com");
四谴古、JSONP
?AJAX跨域請求受限,而直接通過script標(biāo)簽獲取js文件不受限稠歉,JSONP正是利用這個(gè)原理實(shí)現(xiàn)的跨域請求掰担。
模擬數(shù)據(jù):
{(callback)}({ "name":"ken","password":"hahahaha"})
服務(wù)器端: //數(shù)據(jù)作為回調(diào)函數(shù)參數(shù)傳回
var string = fs.readFileSync('./qq_private.jsonp','utf-8')
response.setHeader('Content-Type', 'application/json;charset=utf-8')
string=string.replace("{(callback)}",query.callback)
response.end(string)
客戶端: //定義函數(shù)處理接收到的數(shù)據(jù)
function fn(data){
console.log(data)
}
var script=document.createElement("script")
script.src="http://qq.com/qq_private.jsonp?functionName=fn"
document.head.appendChild(script)
四、CORS和JSONP的區(qū)別
- 原理不同怒炸,CORS是通過類似白名單的方式完成AJAX異域請求带饱,而JSONP卻是利用<script>標(biāo)簽的請求不受同源政策影響實(shí)現(xiàn)的,事實(shí)上已經(jīng)與AJAX無關(guān)。
- JSONP由于其利用<script>的src屬性發(fā)送請求勺疼,只能是GET方法教寂,而CORS支持所有請求方法
- JSONP由于并沒有訪問權(quán)限的設(shè)置,相當(dāng)于大家都可以訪問該數(shù)據(jù)执庐,因此存在了一定安全問題酪耕,而CORS由于本身就是只有允許的源才可訪問成功,故相對安全
- JSONP支持老式瀏覽器轨淌,因?yàn)槠浔举|(zhì)只是<script>標(biāo)簽請求而已迂烁,而CORS則需要服務(wù)器與客戶端瀏覽器同時(shí)支持
1.JavaScript標(biāo)準(zhǔn)參考教程-同源政策 阮一峰
2.HTTP訪問控制 MDN
3.瀏覽器的同源策略 MDN
4.說說JSON和JSONP,也許你會豁然開朗递鹉,含jQuery用例