cuiweisaidelike 2013-05-14
一.要理解浏览器的同源策略,首先要理解http的请求过程。
1.浏览器收到用户输入的url,如www.baidu.com
2.浏览器根据域名去DNS服务器查找对应的服务器ip
3.浏览器与服务器上的80端口建立tcp连接
4.浏览器将http请求报文发给服务器
5.服务器接收请求,将html文件以响应报文的形式发给浏览器
6.浏览器接收到响应报文,解析其中的html文件,渲染。如果html文件中有引用其他资源,如
<script type="text/javascript" src="www.test.com/a.js"/>,浏览器会再发出一个独立的请求,去请求其他资源。
详细内容见《http权威指南》
二.然后是cookie的传输和修改
cookie存在于浏览器的文件中,每次浏览器向服务器发送http请求的时候,比如请求www.baidu.com,浏览器就会找到域名www.baidu.com对应的cookie值,把这些值放在http请求头里,发送给服务器端。然后我们可以在服务器调用api来获得,修改cookie,当服务端给浏览器发送响应报文时,会将修改过的cookie放在http响应头里,发送给浏览器。
三.同源策略
1.cookie,在发送http请求时,浏览器默认只会将相同域名下的cookie值发送给服务器,关于子域名的方面的设置可以参考网络上的信息,在js代码中,也只能获得和修改该js所在窗口的域名的cookie值。
2.ajax,在发送异步http请求时,也只能发送给相同域名的服务器,跨域ajax其实不是原生ajax,用的是另外的技术,后面再看。
3.页面有框架的情况,比如A域名的页面total.html里有一个FRAMESET,这个FRAMESET里有三个FRAME,域名分别是A,B,C,分别是a.html,b.html,c.html。那么total.html可以访问a.html中的具体元素,比如函数,dom对象,b.html与c.html互不能访问,b.html与total.html也互不能访问。
四.同源策略的同源
同源是指,域名,协议,端口相同,域名是指document对象的domain属性
五.常用的越过同源策略的方法
1.跨域ajax
原理在于,对资源文件的加载是不受同源策略影响的,比如
<script type="text/javascript" src="test.com/checkUser.js?name=test"/>
这会导致浏览器去请求checkUser.js?name=test然后把结果当作javascript放在当前页面中执行。具体可以在百度上搜jsonp
2.如果有2个frame在一个页面中,他们主域名相同,而子域名不同的,可以通过设计document.domain来解决。比如mytest1.test.com,mytest2.test.com可以在页面的js中加入document.domain=test.com这样,他们这两个frame就可以互相访问对方的方法和元素了
3.frame中session丢失的问题
P3P是为了防止第三方滥用用户信息而出的,由于P3P协议默认情况下禁止frame使用cookie,而session一般是由cookie来保证的,所以session失效。为了解决这个问题,需要在要使用session的响应头中加上P3P的代码。