处理跨域

  想要了解跨域,首先需要模拟出跨域的环境.

跨域?:   协议,端口号,子域名,主域名只要其中有一个不一样的.比如a.com和b.com互相调用,这就会发生跨域问题,

根本原因:同源策略(出于安全考虑)

跨域环境准备:

非常简单的跨域环境:

比如:http://localhost:80/

http://127.0.0.1:80/

localhost:80和127.0.0.1:80看上去是同一个,但是域名不同,也算是跨域的,可以根据这个简单地了解跨域

比较复杂点的跨域环境准备:

wampserver下创建多站点.我使用HBuilder配置php编写环境(这个只需要在创建好的站点下分别创建web项目,然后指定外置web服务器到你的站点下就可以--有点简单粗暴,).

wampserver不太好弄,安装的过程容易遇到各种问题.推荐慕课网的php入门基础中老师详细介绍的wampserver环境配置(目前发现的讲得条理清晰详细的一个教程),耐心一步步跟着做,可能因为版本不同也会出现一些小问题,但是都能百度各种大海捞针解决的.

1.比较简单地跨域  xhr2(html5新推出的)

当前html访问路径:  http://test01.com/test01_php/index.html

想要访问的:demo.php访问路径:http://test02.com/php/demo.php

可以看到,这两个文件并不是同源的,就会产生跨域问题

index.html

<!DOCTYPE >
<html>

    <head>
        <meta charset="utf-8" />
        <title>跨域测试</title>
        <script type="text/javascript" src="js/jquery.min.js"></script>
        <script>
            $(document).ready(function() {

                $("#btn").click(function() {
                    $.ajax({ /**/
                        url: 'http://test02.com/php/demo.php',
                        type: 'GET',
                        success: function(data) {
                            $(text).html(data);
                        }
                    });

                });

            });
        </script>
    </head>

    <body>

        <input id="btn" type="button" value="获取跨域数据" />
        <textarea id="text" style="width: 400px; height: 100px;"></textarea>
    </body>

</html>

demo.php(php中没有写什么,只返回了一个"hello")

<?php
header("Content-Type:application/txt;charset=utf-8");
/*header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Methods:POST,GET");*/
echo "hello";
?>

点击获取跨域信息 :

控制台报错,没有权限访问(当然,什么都没有返回,):



把demo,php中的注释去掉

demo.php

<?php
header("content-type:application/json");
$jsonp = $_GET['callback'];
$json_data ='{"name":"网站","age":4}';
echo $jsonp."(".$json_data.")";

?>
点击获取跨域数据:


可以看到能够实现

  http://test01.com/test01_php/index.html

和 http://test01.com/php/demo.php   不同域之间地访问了.

关键的地方:

header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Methods:POST,GET");
不过这个还允许通配符* :允许所有不同域的请求并访问demo.php,(你家什么人都能进,权限容易出现滥用,那得多危险,);

2.还有一种方法是后端做一个代理,前台不需要处理.(目前没接触)

3.JSONP(getjson下)

demo3.html(訪問路徑 : http://test01.com/test01_php/demo3.html)

<!DOCTYPE html>
<html> 
    <head>
        <meta charset="utf-8">
        <title>JSONP 实例</title>
        <script type="text/javascript" src="js/jquery.min.js"></script>
    </head>
    <body>
        <div id="divCustomers">
        </div>
        <button id="btn">确定</button>
        <script>
            $(function() {
                $("#btn").on("click", function() {
                    $.getJSON("http://test02.com/php/demo2.php?callback=?", function(data) {
                       var html = "";
                       for (x in data) {
                       	html += x+":"+data[x]+"<br>";
                       }
                        $('#divCustomers').html(html);
                      
                    });

                })
            })
        </script>
    </body>
</html>

demo2.php(访问路径: http://test02.com/php/demo2.php)

<?php
header("content-type:application/json");
$jsonp = $_GET['callback'];
$json_data ='{"name":"网站","age":4}';
echo $jsonp."(".$json_data.")";
?>

点击确定:


可以看到能够正确地渲染出不同域下返回的数据

JSONP是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来处理返回的数据.


json格式:
{"name":"网站","age":4}
jsonp格式:
callback({"name":"网站","age":4})/*callback就是传递过去的参数,这里把它当作函数使用*/

JSONP(ajax下)

demo.html(访问路径:http://test01.com/test01_php/demo.html)
<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="js/jquery.min.js"></script>
        <script>
            $(function() {
                $("button").on("click", function() {
                    $.ajax({
                        type: "GET",
                        url: "http://test02.com/php/demo3.php?callback=?",
                        async: true,
                        dataType: 'jsonp',
                        success: function(data) {
                            $("span").html(data.name);
                        }
                    });
                })
            })
        </script>
    </head>

    <body>
        <button>确定</button>
        <span></span>
    </body>

</html>

demo3.php(访问路径:http://test02.com/php/demo3.php)

<?php
header("content-type:application/json");
$jsonp = $_GET['callback'];
$json_data ='{"name":"汪星人","age":50}';
echo $jsonp."(".$json_data.")"; 
?>
如下图:

查看访问状态:



还有一些跨域的方法,后面遇到在写,理解跨域,处理跨域并不难.学习跨域最佳的方法:动手实践!!动手实践!!













猜你喜欢

转载自blog.csdn.net/lplife/article/details/80322625