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>