zoukankan      html  css  js  c++  java
  • PHP通过AJAX及Access-Control-Allow-Origin实现跨域访问

      这里的跨域实质上是由浏览器同源策略限制的一类请求场景,浏览器同源策略SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。这里测试下通过Access-Control-Allow-Origin实现不同域名之间的访问,Access-Control-Allow-Origin 响应头指定了该响应的资源是否被允许与给定的orgin共享。

      语法 :

      Access-Control-Allow-Origin: *
           Access-Control-Allow-Origin: <origin>

      *
      对于不需具备凭证(credentials)的请求,服务器会以“*”作为通配符,从而允许所有域都具有访问资源的权限。
      <origin>
      指定一个可以访问资源的URI。

      这里使用四个域名,分别是:本机localhost、shop.com、blog.com、oa.com,在localhost、shop.com、blog.com上都创建一个test.html,在oa.com上创建ajax.php文件。

      test.html代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>ajax跨域</title>
    </head>
    <body>
        <!-- 创建一个按钮并绑定单击事件 -->
        <input type="button" value="走你" onclick="show()">
        <!-- 创建一个空ul -->
        <ul></ul> 
        <script type="text/javascript">
            function show() {
                // 创建xhr对象
                var xhr = new XMLHttpRequest();
                // 监听请求状态
                xhr.onreadystatechange = function() {
                    if (this.readyState == 4) {
                        // 当请求状态变为4时获取响应内容并放入ul
                        document.getElementsByTagName('ul')[0].innerHTML = this.responseText;
                    }
                }
                // 以get方式请求ajax.php
                xhr.open('get', 'http://oa.com/ajax.php', true);
                // 发送请求
                xhr.send(null);
            }
        </script>
    </body>
    </html>

    1、允许单个域名访问

         ajax.php代码如下: 

    // 允许单个域名localhost访问
    header('Access-Control-Allow-Origin: http://localhost');
    echo '<h1>这是oa.com上的响应</h1>';
    foreach ($_SERVER as $key => $value) {
        echo '<li>',$key,'=>',$value,'</li><br>';
    }

     通过loclhost的test.html访问如下:

    通过shop.com、blog.com访问如下:

    2、允许多个域名访问

       ajax.php代码如下:

    //获取要跨域访问的请求源
    $origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';  
    //定义允许跨域访问的请求源  
    $allow_origin = array('http://localhost', 'http://shop.com');  
    //如果请求源在允许列表中就设置允许访问  
    if (in_array($origin, $allow_origin)) {  
        header('Access-Control-Allow-Origin:' . $origin);     
    }
    echo '<h1>这是oa.com上的响应</h1>';
    foreach ($_SERVER as $key => $value) {
        echo '<li>',$key,'=>',$value,'</li><br>';
    }

    PS:$_SERVER['HTTP_ORIGIN'] 字段只有跨域访问时都会存在

     通过loclhost的test.html访问如下:

     通过shop.com的test.html访问如下:

     通过blog.com的test.html访问如下:

    因为blog.com不在被允许访问的数组中,所以仍然不能访问,此处通过定义数组单元实现多个域名的跨域访问。

    2、允许所有域名访问

         ajax.php代码如下:

    //通过通配符*允许所有域名访问
    header('Access-Control-Allow-Origin: *');
    echo '<h1>这是oa.com上的响应</h1>';
    foreach ($_SERVER as $key => $value) {
        echo '<li>',$key,'=>',$value,'</li><br>';
    }

    通过localhost的test.html访问如下:

    通过shop.com的test.html访问如下:

    通过blog.com的test.html访问如下:

    以上就是PHP通过AJAXAccess-Control-Allow-Origin响应头实现跨域访问的方法。

  • 相关阅读:
    自动化测试
    django
    Linux软件推荐
    deepin升级20.1(2021.3)
    struts_自定义日期类型转换器
    struts_01
    JAVA面向对象思想
    springmvc 文件上传
    ajax+struts2 实现省份-城市-地区三级联动
    mybatis——分页插件
  • 原文地址:https://www.cnblogs.com/splendid/p/9796956.html
Copyright © 2011-2022 走看看