• [织梦吧]唯一域名:www.dedecms8.com,织梦DedeCMS学习平台.

当前位置: > 网页制作 > Ajax >

AJAX(XMLHttpRequest)进行跨域请求方法详解(二)

来源: www.dedecms8.com 编辑:织梦吧 时间:2012-02-06点击:
   

2,预检请求

预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。下面的2种情况需要进行预检:
a,不是上面的简单请求,比如使用Content-Type 为 application/xml 或 text/xml 的 POST 请求
b,在请求中设置自定义头,比如 X-JSON、X-MENGXIANHUI 等


注意:在 iis 里进行测试,必须在“应用程序扩展”里面配置 .aspx 扩展的动作允许 OPTIONS。

下面我们举一个预检的请求:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>孟宪会之AJAX跨域请求测试</title>
</head>
<body>
  <input type='button' value='开始测试' nclick='crossDomainRequest()' />
  <div id="content"></div>
  <script. type="text/javascript">
  //<![CDATA[
  var xhr = new XMLHttpRequest();
  var url = 'http://dotnet.aspx.cc/PreflightedRequests.aspx';
  function crossDomainRequest() {
    document.getElementById("content").innerHTML = "开始进行请求……";
    if (xhr) {
      var xml = "<root>测试</root>";
      xhr.open('POST', url, true);
      xhr.setRequestHeader("POWERED-BY-MENGXIANHUI", "Approve");
      xhr.setRequestHeader("Content-Type", "application/xml");
      xhr.onreadystatechange = handler;
      xhr.send(xml);
    } else {
    document.getElementById("content").innerHTML = "不能创建 XMLHttpRequest。";
    }
  }
  function handler(evtXHR) {
    if (xhr.readyState == 4) {
      if (xhr.status == 200) {
        var response = xhr.responseText;
        document.getElementById("content").innerHTML = "结果:" + response;
      } else {
        document.getElementById("content").innerHTML = "不能进行跨越访问。";
      }
    }
    else {
      document.getElementById("content").innerHTML += "<br/>执行状态 readyState:" + xhr.readyState;
    }
  }
  //]]>
</script>
</body>
</html>


上面的例子我们发送 xml 格式的数据,并且,发送一个非标准的HTTP头 POWERED-BY-MENGXIANHUI 来说明服务器端该如何设置响应头的。

在服务器端,PreflightedRequests.aspx 的内容如下:

<%@ Page Language="C#" %>
<script. runat="server">
  protected void Page_Load(object sender, EventArgs e)
  {
    if (Request.HttpMethod.Equals("GET"))
    {     
      Response.Write("这个页面是用来测试跨域 POST 请求的,直接浏览意义不大。");
    }
    else if (Request.HttpMethod.Equals("OPTIONS"))
    {
      //通知客户端允许预检请求。并设置缓存时间
      Response.ClearContent();
      Response.AddHeader("Access-Control-Allow-Origin", "http://www.meng_xian_hui.com:801");
      Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
      Response.AddHeader("Access-Control-Allow-Headers", "POWERED-BY-MENGXIANHUI");
      Response.AddHeader("Access-Control-Max-Age", "30"); 
      //此过程无需返回数据
      Response.End();     
    }
    else if (Request.HttpMethod.Equals("POST"))
    {
      if (Request.Headers["Origin"].Equals("http://www.meng_xian_hui.com:801"))
      {
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        doc.Load(Request.InputStream);
        Response.AddHeader("Access-Control-Allow-Origin", "http://www.meng_xian_hui.com:801");
        Response.Write("您提交的数据是:<br/><br/>" + Server.HtmlEncode(doc.OuterXml));
      }
      else
      {
        Response.Write("不允许你的网站请求。");
      }
    }
  }
</script>

About D8

  • ©2014 织梦吧(d8) DedeCMS学习交流平台
  • 唯一网址 www.DedeCMS8.com 网站地图
  • 联系我们 1978130638@qq.com ,  QQ