关于跨域问题

jackxiang 2010-2-4 14:36 | |
转自:温德馨的博客,哈哈,向东的博客早就O了,链接还是xiangdong.org,哎,我转了一席,他对mysql的io调度和DAS、NAS、SAN存储系统完全分析都有研究和关注,哈哈


一直对JS的跨域概念很迷惑,记得是在刚学ajax的时候才了解了一下这个概念,后来就再没有接触。主要工作上是做PHP为主,前端的东西几乎不需要插手。今天看了膘叔的一篇文章《孟宪会之AJAX(XMLHttpRequest)进行跨域请求方法详解》,一直是知道跨域会存在问题,但是自己就没有动过手体验一下具体会造成什么问题,于是决定试验一下。在blog服务器上写了个test.php测试脚本

  <?php
  $data = array('status' => 1, ‘msg’ => ‘hello’);
  echo json_encode($data);
  ?></p>
  <p>

前端测试页面


  <script>
  var xhr = new XMLHttpRequest();
  var url = "http://jackywdx.cn/test.php";
  function test(){
      if(xhr)
      {
          xhr.open('GET', url, true);
          xhr.onreadystatechange  = handler;
          xhr.send();
      }
  }
  function handler(evtxhr)
  {
      if(xhr.readyState == 4){
          if(xhr.status == 200){
              var re = xhr.responseText;
              alert(re);
          }else{
              alert('status not 200');
              alert(xhr.status);
          }
      }else{
          alert('readyState not 4');
          alert(xhr.readyState);
      }
  }</p>
  <p><body onload="test()">
  hello
  </body>


在本地访问,http://test.cn/test.html 结果是失败,没有alert出responseText; 在test.php文件里面增加一句: header(”Access-Control-Allow-Origin:http://test.cn”); 这样就可以了。我用的FF版本是3.5.7,所以支持这个Access-Control-Allow-Origin HTTP头部参数。用HTTPFOX抓包看到结果:

(Request-Line)

GET /test.php HTTP/1.1

Host jackywdx.cn

User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language zh-cn,zh;q=0.5

Accept-Encoding gzip,deflate

Accept-Charset GB2312,utf-8;q=0.7,*;q=0.7

Keep-Alive 300

Connection keep-alive

Referer http://test.cn/test.html

Origin http://test.cn

(Status-Line) HTTP/1.1 200 OK

Server nginx/0.7.61

Date Fri, 29 Jan 2010 02:43:39 GMT

Content-Type text/html

Transfer-Encoding chunked

Connection close

X-Powered-By PHP/5.2.6

Access-Control-Allow-Origin http://test.cn

Author jackywdx

X-Via US_RASHOST_VPS

Content-Encoding gzip

解决JS跨域问题还有一些解决办法:

如果是同一主域的话可以设置document.domain

另外还可以通过flash来作为中转角色,flash跨域可以通过crossdomain.xml来解决,不过这种方法速度会比较慢。毕竟多了一层中间层。

还有一种比较土的方法就是在相册的域下面做一个同样的接口-.-

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2683/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!

评论列表
2010-2-4 15:01 | 孩子
留爪。
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]