js跨域及解决方案

js跨域及解决方案,第1张

概述1.什么是跨域我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题.跨域问题是由于javascript语言安全限制中的同源策略造成的.简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合.例如: 2.实现原

1.甚么是跨域

我们常常会在页面上使用AJAX要求访问其他服务器的数据,此时,客户端会出现跨域问题.

跨域问题是由于JavaScript语言安全限制中的同源策略酿成的.

简单来讲,同源策略是指1段脚本只能读取来自同1来源的窗口和文档的属性,这里的同1来源指的是主机名、协议和端口号的组合.

例如:

2.实现原理

在HTML DOM中,Script标签是可以跨域访问服务器上的数据的.因此,可以指定script的src属性为跨域的url,从而实现跨域访问.

例如:

这类访问方式是不行的.但是以下方式,却是可以的.

这里对返回的数据有个要求,即:服务器返回的数据不能是单纯的如{“name”:”zhangsan”}

如果返回的是这个Json字符串,我们是没有办法援用这个字符串的.所以,要求返回的值,务必是var Json={“name”:”zhangsan”},或Json({“name”:”zhangsan”})

为了使程序不报错,我们务必还要建立个Json函数.

3.解决方案

方案1

服务器端:

    protected voID Page_Load(object sender,EventArgs e)    {        string result = "callback({"name":"zhangsan","date":"2012⑴2-03"})";        Response.Clear();        Response.Write(result);        Response.End();    }

客户端:

<!DOCTYPE HTML PUBliC "-//W3C//DTD xhtml 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-Transitional.dtd">@H_419_44@<HTML@H_419_44@ xmlns@H_419_44@="http://www.w3.org/1999/xhtml"@H_419_44@>@H_419_44@<head@H_419_44@>@H_419_44@ <Title@H_419_44@>@H_419_44@</Title@H_419_44@>@H_419_44@ <script@H_419_44@ type@H_419_44@="text/JavaScript"@H_419_44@>@H_419_44@ var@H_419_44@ result = null@H_419_44@; window.onload = function@H_419_44@ ()@H_419_44@ {@H_419_44@ var@H_419_44@ script = document.createElement("script"@H_419_44@); script.type = "text/JavaScript"@H_419_44@; script.src = "http://192.168.0.101/ExampleBusinessApplication.Web/web2.aspx"@H_419_44@; var@H_419_44@ head = document.getElementsByTagname("head"@H_419_44@)[0@H_419_44@]; head.insertBefore(script,head.firstChild); }; function@H_419_44@ callback@H_419_44@(data)@H_419_44@ {@H_419_44@ result = data; } function@H_419_44@ b_click@H_419_44@()@H_419_44@ {@H_419_44@ alert(result.name); } @H_419_44@</script@H_419_44@>@H_419_44@</head@H_419_44@>@H_419_44@<body@H_419_44@>@H_419_44@ <input@H_419_44@ type@H_419_44@="button"@H_419_44@ value@H_419_44@="click me!"@H_419_44@ onclick@H_419_44@="b_click();"@H_419_44@ />@H_419_44@</body@H_419_44@>@H_419_44@</HTML@H_419_44@>@H_419_44@

方案2,通过jquery来完成

通过jquery的Jsonp的方式.使用此方式,对服务器端有要求.

服务器端以下:

    protected voID Page_Load(object sender,EventArgs e)    {        string callback = Request.queryString["Jsoncallback"];        string result = callback + "({"name":"zhangsan","date":"2012⑴2-03"})";        Response.Clear();        Response.Write(result);        Response.End();    }

客户端:

$.AJAX({ async: false@H_419_44@,url: "http://192.168.0.5/Web/web1.aspx"@H_419_44@,type: "GET"@H_419_44@,dataType: 'Jsonp'@H_419_44@,//Jsonp的值自定义,如果使用Jsoncallback,那末服务器端,要返回1个Jsoncallback的值对应的对象. @H_419_44@ Jsonp: 'Jsoncallback'@H_419_44@,//要传递的参数,没有传参时,也1定要写上 @H_419_44@ data: null@H_419_44@,timeout: 5000@H_419_44@,//返回Json类型 @H_419_44@ ContentType: "application/Json;utf⑻"@H_419_44@,//服务器段返回的对象包括name,data属性. @H_419_44@ success: function@H_419_44@ (result)@H_419_44@ {@H_419_44@ alert(result.date); },error: function@H_419_44@ (jqXHR,textStatus,errorThrown)@H_419_44@ {@H_419_44@ alert(textStatus); } });

实际上,在我们履行这段Js时,Js向服务器发出了这样1个要求:

http:@H_419_44@//192.168@H_419_44@.0@H_419_44@.5@H_419_44@/Web/web1.aspx@H_419_44@?Jsoncallback=Jsonp1354505244726&_=1354505244742@H_419_44@

而服务器也相应的返回了以下对象:

Jsonp1354506338864@H_419_44@({"name"@H_419_44@:"zhangsan"@H_419_44@,"date"@H_419_44@:"2012⑴2-03"@H_419_44@}@H_419_44@)@H_419_44@@H_419_44@

此时就实现了跨域范文数据的要求.

总结

以上是内存溢出为你收集整理的js跨域及解决方案全部内容,希望文章能够帮你解决js跨域及解决方案所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1017346.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存