欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

处理跨域

程序员文章站 2022-07-10 20:21:26
...

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

跨域?:   协议,端口号,子域名,主域名只要其中有一个不一样的.比如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.")"; 
?>
如下图:

处理跨域

查看访问状态:

处理跨域

处理跨域

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













上一篇: Mock.js

下一篇: 跨域处理实践