追寻人生

学习之园地,创意之源泉

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最近做个发帖时把帖子信息发送一份到服务器上的功能。最先想到用ajax异步方式来实现,
JS代码如下:
function AsyncPost(strurl,strpost)

   //xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
   var xml = new ActiveXObject("Microsoft.XMLHTTP"); 
   xml.open("POST",strurl,false);//使用POST方法打开一个到服务器的连接,以异步方式通信 
   xml.setrequestheader("content-length",strpost.length); 
   xml.setrequestheader("content-type","application/x-www-form-urlencoded"); 
   xml.send(strpost);//发送数据 
   var res = xml.responseText;//接收服务器返回的数据 
   //document.write(res);
   if(res=="Y") 
   { 
      alert("发表成功!"); 
      window.location.href('AddNoteXMLHTTP.aspx'); 
   } 
   else 
      alert("发表失败!"); 
   xml=null;
}

可是在点击“发表”按钮时,提示“该页正在访问其控制范围之外的数据。这有些危险。是否继续?”,偶的机子系统是Windows 2000,在我同事装有Windows 2003的机子上,连这个提示都没了,直接报脚本错误,“没有权限”。
在网上搜索了好多资料,有下列3种解决方案:
1、跨浏览器安全性是浏览器根据区域设定的安全权限。
在子域的情况下,通过设置document.domain属性,可以截掉域名所匹配的一部分内容,例如:在一个来自http://www.myisp.com/dave的脚本中,我们向脚本中添加上一行:
  document.domain='myisp.com';
这将允许这个脚本和来自子域http://dave.myisp.com/的脚本进行交互,假设那个脚本也设置了document.domain的值。然而,不可能将document.domain设置为任意值,例如:www.google.com。
或者
在IE里面设置,工具->Internet选项->安全->受信任的站点,添加服务器端的网站。

2、客户端的xmlhttpReqest不能加载其它的站点数据,只能用服务器端来做,方法是一样的。
此方法我有做一些尝试,在客户端改为server.createObject("Msxml2.XMLHTTP"),提示“server未定义”脚本错误。若放在服务器端,要如何做?有哪位高手可以指点一下?

<%
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttp.open "GET","http://www.asdf/4152314.xml",false;
xmlHttp.send();
xmldoc = xmlHttp.responseXML
%>
其中的xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 改为 xmlhttp = server.createObject("Msxml2.XMLHTTP")

3、浏览器的安全性设置不允许站点页面中的XMLHttpRequest请求其它站点的内容。不过通过构造IFrame应该可以做到。(偶没有测试过)

最后,绕开上述思想,用System.Net.HttpWebRequest 类来实现,代码如下:
   //WebSite为服务器接收页面url,strQuery为数据参数队列
   Encoding encoding = Encoding.UTF8;
   byte[] data = encoding.GetBytes(strQuery);   
   // 准备请求...
   HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(WebSite);
   myRequest.Method = "POST";
   myRequest.ContentType="application/x-www-form-urlencoded";
   myRequest.ContentLength = data.Length;
   Stream newStream=myRequest.GetRequestStream();
   // 发送数据
   newStream.Write(data,0,data.Length);
   newStream.Close();

这样也就可以绕开上述的棘手问题了。希望对大家有所帮忙。


posted on 2007-05-29 11:17  追梦华仔  阅读(6248)  评论(3编辑  收藏  举报