源码论坛公告:本站是一个交流学习建站资源的社区论坛,旨在交流学习源码脚本等资源技术,欢迎大家投稿发言! 【点击此处将锦尚放在桌面

源码论坛,商业源码下载,尽在锦尚中国商业源码论坛

 找回密码
 会员注册

QQ登录

只需一步,快速开始

查看: 5308|回复: 0

[JavaScript] 完美解决AJAX跨域问题

[复制链接]

1193

主题

1561

帖子

8820

金币

超级版主

Rank: 8Rank: 8

积分
19326
发表于 2022-12-29 12:33:27 | 显示全部楼层 |阅读模式
从AJAX诞生那天起,XMLHttprequest对象不能跨域请求的问题就一直存在。这似乎是一个很经典的问题了。是由于javascript的同源策略(这里不作深入探讨)所导致。

解决的办法,大概有如下几种:

1. 使用中间层过渡的方式(可以理解为“代理”):

中间过渡,很明显,就是在AJAX与不同域的服务器进行通讯的中间加一层过渡,这一层过渡可以是PHP、JSP、c++等任何具备网络通讯功能的语言,由中间层向不同域的服务器进行读取数据的操作。拿asp.net做一个例子,如果需要对不同域的某一个asp.net进行通讯,现在客户端的xmlhttprequest先query本域的一个asp.net ,然后由本域的这个asp.net去和不同域的asp.net进行通讯,然后由本域的asp.net响应输出(response);思路大概就是这样的,相信读者已经很清楚的理解了。

2. 使用<script>标签

这个方法是利用<script>标签中的src来query一个aspx获得response,因为<script>标签的src属性不存在跨域的问题。

举个例子来让大家看得更清楚一点吧:


  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <title>Ajax跨域问题</title>
  5.     <script type="text/javascript" src="" id="getAspx">
  6.     </script>
  7.     <script type="text/javascript">
  8.         function get(url) {
  9.             var obj = document.getElementById("getAspx");
  10.             obj.src = url;
  11.             (obj.readStatus == 200)
  12.             {
  13.                 alert(responseVal);//如果成功,会弹出Dylan
  14.             }
  15.         }
  16.         function query() {
  17.             get(getDemo.aspx);
  18.         }
  19.     </script>
  20. </head>
  21. <body>
  22. <input type="button" value="Ajax跨域测试" onclick="query();"/>
  23. </body>
  24. </html>
复制代码

getDemo.aspx后台代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. namespace LearnJS
  8. {
  9.     public partial class getDemo : System.Web.UI.Page
  10.     {
  11.         protected void Page_Load(object sender, EventArgs e)
  12.         {
  13.             Response.Write("var responseVal='Dylan'");
  14.         }
  15.     }
  16. }
复制代码

这个方法又叫做ajaj或者ajax without xmlHttprequest,把x换成了j,是因为使用了<script>标签而没有用到xml和xmlHttprequest的缘故。这种方法似乎有点“另类”,哈哈。
那现在我们就看看,有了jQuery之后,如何来解决ajax的跨域问题,代码如下:

  1. <html>
  2. <head>
  3. <title>JQuery学习</title>
  4. <script src="jquery-1.4.2.min.js" type="text/javascript"></script>
  5. <script type="text/javascript">
  6. $(document).ready(function(){
  7.     var oBtnTest = $("#btnTest");
  8.     oBtnTest.click(function(){
  9.         oBtnTest.disabled = true;   
  10.         var oResult = $("#result");
  11.         oResult.html("loading").css("color","red");
  12.         jQuery.getScript("https://bbs.52jscn.com/test/js.txt",
  13.         function(){           
  14.             oResult.html("name:" + Dylan.name + "<br/>email:" + Dylan.email).css("color","black");           
  15.             oBtnTest.disabled = false;           
  16.         });        
  17.     });   
  18. });   
  19. </script>
  20. </head>
  21. <body>
  22. <button id="btnTest">BtnTest</button>
  23. <div id="result"></div>
  24. </body>
  25. </html>
复制代码

远程服务器端js.txt中的内容为:
var Dylan= {name:"Dylan",email:Dylan@163.com}

笔者感觉这种方式更加简洁。呵呵。当然,读者可以根据实际情况,任意选择实现方式。

怎么样,其实很简单吧,我看到过很多人不愿意去正视ajax所存在的技术瓶颈,其实AJAX更应该是Ajax而不是AJAX,突出第一个A是想强调其实AJAX发扬的是一种异步传输的方法,而不是具体到底使用了哪种技术。

其实,在json数据格式之后,有一种更牛X的“jsonp”,也可以实现ajax的跨域通信。其实jsonp不是一种数据格式,只是对我介绍的第二种方式做了改进。从jQuery1.2 版本开始,jQuery 拥有对 JSONP 回调的本地支持。
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

锦尚中国源码论坛

聚合标签|锦尚中国,为中国网站设计添动力 ( 鲁ICP备09033200号 ) |网站地图

GMT+8, 2024-2-26 00:40 , Processed in 0.093750 second(s), 25 queries .

带宽由 锦尚数据 提供 专业的数据中心

© 锦尚中国源码论坛 52jscn Inc. 非法入侵必将受到法律制裁 法律顾问:IT法律网 & 褚福省律师 锦尚爱心 版权申诉 版权与免责声明