• 跨域


    协议,域名,端口都必须相同,才算在同一个域

    ajax是否允许跨域?

         说明  是否允许通信
     http://www.a.com/a.php  http://www.a.com/a.php  同一个域名下   是
     http://www.a.com/aa/a.php  http://www.a.com/bb/b.php  同一域名下不同文件夹  是
     http://www.a.com:8000/a.php  http://www.a.com/b.php  同一个域名不同端口  否
     http://www.a.com/a.php  https://www.a.com/a.php  同一域名,不同协议  否
     http://www.a.com/a.php  http://170.32.82.74/b.php  域名和域名对应ip  否
     http://www.a.com/a.php  http://script.a.com/b.php  同一域名,不同二级域名  否
     http://www.a.com/a.php  http://a.com/b.php  二级域名和一级域名  否
     http://www.b.com/a.php  http://www.a.com/b.php  不同域名  否
     
    解决方法(1):
    在被请求的Response header中加入

    header('Access-Control-Allow-Origin:*');

    就可以实现ajax POST跨域访问

    这是html5新增的一项标准功能

    在服务器响应客户端的时候,带上Access-Control-Allow-Origin头信息,一个跨域请求就不会被浏览器的同源安全策略所阻止了

    • 如果设置 Access-Control-Allow-Origin:*,则允许所有域名的脚本访问该资源。
    • Access-Control-Allow-Origin:http://www.phpddt.com.com,允许特定的域名访问。

    跨域解决后,如果还要操作Cookie,还得继续补增响应头:

    header('Access-Control-Allow-Credentials:true');

    需要将 XMLHttpRequest 对象的 withCredentials 属性设置为 true,JQuery1.5.1+ 就开始提供了相应的字段,使用方式如下:

    $.ajax({
      url:"B.abc.com",
      xhrFields:{
      withCredentials:true
    },
      crossDomain:true
    });

    设置 withCredentials 为 true 的请求中会包含 A.abc.com端的所有Cookie,这些Cookie仍然遵循同源策略,所以,你只能访问其中和 abc.com/B同根域的Cookie,而无法访问其他域的Cookie

    Cross-Origin Resource Sharing,跨域资源共享,简称 CORS,可以作为一种跨域请求以及响应的解决方案

    eg:需要设置多个域名允许访问

    <?php  
    $ret = array(  
        'name' => isset($_POST['name'])? $_POST['name'] : '',  
        'gender' => isset($_POST['gender'])? $_POST['gender'] : ''  
    );  
      
    header('content-type:application:json;charset=utf8');  
      
    $origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';  
      
    $allow_origin = array(  
        'http://www.client.com',  
        'http://www.client2.com'  
    );  
      
    if(in_array($origin, $allow_origin)){  
        header('Access-Control-Allow-Origin:'.$origin);   //指定其他域名访问
        header('Access-Control-Allow-Methods:POST');      //相应类型
        header('Access-Control-Allow-Headers:x-requested-with,content-type');  //响应头设置  
    }  
      
    echo json_encode($ret);  
    ?>  

     解决方法(2):

      跨域使用POST方式,可以使用创建一个隐藏的iframe来实现

     解决方法(3):

      JSONP方法,这种方法只支持GET方式

      ajax请求参数dataType:'JSONP'

    附:

      禁用chrome本地安全策略,不用配服务器环境也能发起ajax请求:
      chrome 桌面快捷键 右键属性 在快捷方式标签下的“目标”框中加入 --disable-web-security,重启浏览器即可

  • 相关阅读:
    联赛前第七阶段总结
    tomcat启动服务一会后自动关闭
    删除软件服务
    jmeter ramp-up解释
    mysql数据库报错1045
    tomcat在linux上的安装
    ant在linux下的安装部署
    查看一条mysql语句的性能
    linux下安装svn服务器
    InfluxDB数据库报错ERR: unable to parse authentication credentials Warning: It is possible this error is due to not setting a database. Please set a database with the command "use <database>".
  • 原文地址:https://www.cnblogs.com/baby123/p/5336086.html
Copyright © 2020-2023  润新知