最近做个发帖时把帖子信息发送一份到服务器上的功能。最先想到用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();
这样也就可以绕开上述的棘手问题了。希望对大家有所帮忙。