zoukankan      html  css  js  c++  java
  • AJAX实现跨域的三种方法

    由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问。

    比如说你的网站域名是aaa.com,想要通过AJAX请求bbb.com域名中的内容,浏览器就会认为是不安全的,所以拒绝访问。

    会出现跨域问题的几种情况:

    ajax

    后台在百度上寻找解决方案解决了这个问题,一共总结出三种方案:代理JSONPXHR2(XMLHttpRequest Level 2)

    第一种方法:代理

    这种方式是通过后台(ASP、PHP、JAVA、ASP.NET)获取其他域名下的内容,然后再把获得内容返回到前端,这样因为在同一个域名下,所以就不会出现跨域的问题。

    实现代码:创建一个AJAX请求(页面地址为:http://localhost/ajax/proxy.html)

    var request = null;
    if(window.XMLHttpRequest){
       request = new XMLHttpRequest;
    }else{
       request = new ActiveXObject("Microsoft.XMLHttp");
    }
    request.onreadystatechange = function{
       console.log(this.readyState);
       if(this.readyState===4 && this.status===200){
        var resultObj = eval("("+this.responseText+")");    //将返回的文本数据转换JSON对象
         document.getElementById("box").innerHTML = resultObj.name+":"+resultObj.sex;    //将返回的内容显示在页面中
       }
    }
    request.open("POST","proxy.php",true);
    request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    request.send("name=吕铭印&sex=男");

    创建AJAX请求。
    proxy.php代码

    header("Content-type:text/html;charset=utf-8");
    $url = "http://localhost:63342/ajax/proxy.js";
    $contents = file_get_contents($url);
    echo $contents;

    第二种方法:JSONP(只支持GET请求)

    后来人们发现,在调用Js文件的时候不受跨域的影响,这样就衍生了第二种方案。 就是在远程服务器端把数据装入js文件中,供客户端调用和进一步处理。 jsonp.html

    var url = "http://localhost:63342/ajax/jsonp.php?name=吕铭印&sex=男&callbackname=jsonp_callback"; //访问localhost:63342下的jsonp.php
    var scriptTag = document.createElement("script");   //创建一个script标签
    scriptTag.setAttribute("src",url);  //设置script的src属性
    document.body.appendChild(scriptTag);   //将script标签添加到body中
    //回调函数
    var jsonp_callback = function(resultObj){
            document.getElementById("box").innerHTML = resultObj.name+":"+resultObj.sex;
    }
    jsonp.php
    $name = $_GET["name"];
    $sex = $_GET["sex"];
    $callbackname = $_GET["callbackname"];    //回调函数名称
    echo "$callbackname({name:'$name',sex:'$sex'})";

    jsonp.html运行结果:

    实现原理:由于使用script标签调用远程js文件没有不受跨域的影响,所以可以通过创建一个script标签,通过src属性来访问远程文件。
    其实这并不属于AJAX,但是可以实现类似AJAX的功能。

    第三种方法:XMLHttpRequest Level 2

    HTML5提供的XMLHttpRequest Level 2已经实现了跨域访问以及其他的一些新功能
    这需要在远程服务器端添加如下代码

    header('Access-Control-Allow-Origin:*'); //*代表可访问的地址,可以设置指定域名
    header('Access-Control-Allow-Methods:POST,GET'); 

    这样在客户端使用常规的AJAX代码即可。

    总结:

    代理实现最麻烦,但使用最广泛,任何支持AJAX的浏览器都可以使用这种方式。
    JSONP相对简单,但只支持GET方式调用。
    XHR2最简单,但只支持HTML5,如果你是移动端开发,可以选择使用XHR2。

  • 相关阅读:
    ubuntu安装jdk的两种方法
    LeetCode 606. Construct String from Binary Tree (建立一个二叉树的string)
    LeetCode 617. Merge Two Binary Tree (合并两个二叉树)
    LeetCode 476. Number Complement (数的补数)
    LeetCode 575. Distribute Candies (发糖果)
    LeetCode 461. Hamming Distance (汉明距离)
    LeetCode 405. Convert a Number to Hexadecimal (把一个数转化为16进制)
    LeetCode 594. Longest Harmonious Subsequence (最长的协调子序列)
    LeetCode 371. Sum of Two Integers (两数之和)
    LeetCode 342. Power of Four (4的次方)
  • 原文地址:https://www.cnblogs.com/shoestrong/p/5530078.html
Copyright © 2011-2022 走看看