浏览器的安全策略
什么是同源策略
跨域有几种常见的方式?
跨域使用的经验?
方式:
使用jsonp实现跨域?
使用cors实现跨域?
浏览器另类的跨域机制(除了ajax发请求产生跨域,还有几种场景会涉及跨域)?
一、浏览器的安全策略:同源策略
1、什么是同源
(1)同源(或本域)指:
- 同协议:如都是http或者https
- 同域名:如都是http://jirengu.com/a 和http://jirengu.com/b
- 同端口:如都是80端口
(2)实例:同源 VS 不同源
A、同源,如:
http://jirengu.com/a/b.js 和 http://jirengu.com/index.php
B、不同源,即会产生跨域
- 协议不同: http://jirengu.com/main.js 和 https://jirengu.com/a.php
- 域名不同,域名必须完全相同才可以: http://jirengu.com/main.js 和 http://bbs.jirengu.com/a.php
- 端口不同,第一个是80:http://jiengu.com/main.js 和 http://jirengu.com:8080/a.php
2、同源策略
即 浏览器出于安全方面的考虑,有时候只允许脚本与本域下的接口交互。
(1)页面发请求时,当前的url必须与接口的url对应起来(三同原则)
(2)浏览器所需的安全策略场景:
不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。
A、发请求:如发送一个ajax请求去获取天气,所发请求与当前页面所在域是属于同域,请求响应,浏览器则会接受该请求。这属于浏览器接受请求的安全策略。(如禁止浏览器的安全策略,则不存在任何跨域)
B、嵌入iframe的内联页面:涉及到用户登录的安全性,假如进入一个含有内联页面的主页面中,JS若能操作内页交互,获取了内页中含有的用户重要的信息,如支付信息等
总结:安全策略则遵循同源策略。对于当前页面来说页面引入 JS 文件的域不重要,重要的是加载该 JS 文件所在的域或url(执行环境)。假如写了一个页面,引入了百度页面的js或css等,并不存在什么跨域问题。同源所指的是js执行环境的当前页面url,并不是js文件的地址
二、 跨域
1、跨域
跨域,是一种现象。绕过浏览器的同源策略获取数据。怎么绕过呢?即直接没有任何“三同”限制就能获取数据。
2、产生跨域
跨域的实例演示:修改host文件:给host文件 添加两条记录,这里使用http://a.com和http://b.com构造一本机下的两个不同域名平台,方便跨域操作
//同本机 不同域名
127.0.0.1 a.com //浏览器url
127.0.0.1 b.com //接口url
3、出现疑问:
跨域是由谁产生?请求是否发出去?响应是否产生?
A、现象:出现报错,数据未返回看不到的三种情况:
- 第1种情况:请求未发出去,浏览器拦截掉
- 第2种情况:请求发出去,服务器发现不一样,无响应
- 第3种情况:请求发出去,服务器有响应,数据返回时,浏览器发现数据未匹配
B、实例演示第3种情况:
index.html:
//index.html
<h1>hello world</h1>
<script>
var xhr = new XMLHttpRequest()
xhr.open('GET','http://b.com:8080/getWeather', true)
xhr.send()
xhr.onload = function(){
console.log(xhr.responseText)
}
</script>
server.js
//server.js
var http = require('http')
var fs = require('fs')
var path = require('path')
var url = require('url')
http.createServer(function(req, res){
var pathObj = url.parse(req.url, true)
//console.log(pathObj)
switch (pathObj.pathname) {
case '/getWeather':
console.log('get Weather')/*执行*/
res.end(JSON.stringify({beijing: