1: 跨域的理解
说起跨域就必须要提同源策略,浏览器问了安全,制定了同源策略,即同协议、同域名、同端口号,若其中有一点存在不同就会违背同源策略,导致无法获得数据。(若是非同源的,其实浏览器会向服务器发起请求,但是会拒绝接收服务器返回的数据)
举例:在本地存在2个项目,web1和web2,同时运行在两个端口3000和3001,当web1向web2发起请求http://localhost:3001/ajax/deal时,就会造成跨域问题。
2:jsonp
既然这么容易跨域,那就得想解决方法。我们发现,当在web1中,使用
<script src="http://localhost:30001/test.js"></script>
发现script标签并没有同源的限制,我们可以正常获得test.js。jsonp就是利用script标签的这个特点,在本地创建一个回调函数,然后在远程服务上调用这个函数,并且将需要的数据拼接成json数据的形式作为参数传递,完成回调。
其实jsonp的实质就是将json数据填充进回调函数,jsonp = json+padding。
举例:web2中服务端的一段代码
public class MyService : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//获取回调函数名
string callback = context.Request.QueryString["callback"];
//json数据
string json = "{\"name\":\"chopper\",\"sex\":\"man\"}";
context.Response.ContentType = "application/json";
//输出:回调函数名(json数据)
context.Response.Write(callback + "(" + json + ")");
}
public bool IsReusable
{
get
{
return false;
}
}
}
web1中页面中代码
<script type="text/javascript">
function addScriptTag(src){
var script = document.createElement('script');
script.setAttribute("type","text/javascript");
script.src = src;
document.body.appendChild(script);
}
window.onload = function(){
//调用远程服务
addScriptTag("http://localhost:20002/MyService.ashx?callback=person");
}
//回调函数person
function person(data) {
alert(data.name + " is a " + data.sex);
}
</script>
3: 由于script的原理 所以jsonp只适用于get方法请求。
4:强烈推荐深入浅出jsonp, 很赞
网友评论