1.跨域是怎么产生的?
浏览器的同源策略规定默认情况下,JavaScript在发送AJAX请求时,URL的域名必须和当前页面完全一致。
域名要相同(mp.csdn.com
和mp.csdn2.com
不同),协议要相同(http
和https
不同),端口号要相同(80
端口和:8080
就不同).
同源策略的限制:cookie,localstorage,无法读取 dom无法获取 ajax无法发送
2.为何会有同源策略呢?
当然是为了保证用户信息的安全,防止恶意的网站窃取数据。
1.对cookie的保护 , cookie 中存着sessionID
这个sessionID的作用是什么呢?在我们访问一个网页,登录后,我们可以在一段时间内访问,编辑自己的个人信息,而不是每次访问都需要登录.如果你关闭浏览器,就需要重新登录,这就是sessionID在起作用.
网页是基于Http协议进行解析的,而Http是无状态协议。所谓的无状态便是下一次访问并不知道上一次访问的情况,每访问完一次后便断开连接。那么,服务器是怎么识别访问的用户身份的呢?这里便运用到了Session和Cookie。了解过Session和Cookie的人都会知道,Session是保存在服务器端的,而Cookie是保存在客户端的,每次请求都会带上cookie的信息.打开谷歌浏览器,F12调试模式,站到Application,就能看到Cookies信息.
试想一下,如果你支付宝的Cookies被你随便访问的一个网站获取了,然后他就能各种操作.
3.如何跨域呢?
一是通过Flash插件发送HTTP请求,这种方式可以绕过浏览器的安全限制,但必须安装Flash,并且跟Flash交互。不过Flash用起来麻烦,而且现在用得也越来越少了。
二是通过在同源域名下架设一个代理服务器来转发,JavaScript负责把请求发送到代理服务器,代理服务器再把结果返回,这样就遵守了浏览器的同源策略。这种方式麻烦之处在于需要服务器端额外做开发。
第三种方式称为JSONP,它有个限制,只能用GET请求,并且要求返回JavaScript。这种方式跨域实际上是利用了浏览器允许跨域引用JavaScript资源
<html>
<head>
<script src="http://example.com/abc.js"></script>
...
</head>
<body>
...
</body>
</html>
第四种是设置自己的浏览器,允许跨域,这样做的风险是自己的浏览器会面临不安全的风险,也只适用于自己调试,一般会用一个没有敏感信息的浏览器去设置这种不安全模式.