本文是面试汇总分支——知道什么是同源策略吗?那怎么解决跨域问题?知道 jsonp 原理吗?。
同源策略(same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。 可以说web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
同源策略,它是由netscape提出的一个著名的安全策略。现在所有支持javascript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。
当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。
如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。
域名、协议、端口相同,也就是在同一个域里。
cookie不能读取 (如我在自己的站点无法读取博客园用户的cookie)
dom无法获得
ajax请求不能发送
例如:
一个域的页面去请求另一个域的资源;
a域的页面去请求b域的资源。
动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。
这样一来,这种跨域方式就与ajax xmlhttprequest协议无关了。
jsonp即json with padding
由于同源策略的限制,xmlhttprequest只允许请求当前源(域名、协议、端口)的资源。
如果要进行跨域请求, 我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用json传递javascript对象,这种跨域的通讯方式称为jsonp。
json 是一种数据格式 jsonp 是一种数据调用的方式
首先在客户端注册一个callback (如:'testjsonpcallback'), 然后把callback的名字(如:testjsonpcallback)传给服务器。
注意:
服务端得到callback的数值后,要用testjsonpcallback(......)把将要输出的json内容包括起来,此时,服务器生成 json 数据才能被客户端正确接收。
然后以 javascript 语法的方式,生成一个function, function 名字就是传递上来的参数 'callback'的值 testjsonpcallback.
最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时javascript文档数据,作为参数, 传入到了客户端预先定义好的 callback 函数.
用访问端访问目标主机,目标主机能成功返回 "函数名("参数")" , 表示成功跨域。
感谢:什么是同源策略,什么是跨域,如何跨域,jsonp/cors跨域
作者:习惯沉淀
扫码关注一线码农的学习见闻与思考。
回复"大数据","微服务","架构师","面试总结",获取更多学习资源!