美文网首页
跨域CORS问题简单完美解决

跨域CORS问题简单完美解决

作者: biaoqianwo | 来源:发表于2017-08-25 13:34 被阅读11次

    问题由来

    get请求变成了options,post和delete请求也变成了opeions;原来这就是跨域的非简单请求:

    浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
    非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。
    非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。
    浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。
    只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。
    

    参看:http://www.ruanyifeng.com/blog/2016/04/cors.html
    所以,跨域问题的解决主要在服务器端,

    服务端

    最简单有效的配置是:

     $response->header('Access-Control-Allow-Origin', '*');
     $response->header('Access-Control-Allow-Methods', 'GET,POST,DELETE,PATCH,PUT,OPTIONS');//'*'
     $response->header('Access-Control-Allow-Headers', 'token');//头部运行自定义的字段
     $response->header('Access-Control-Max-Age', 7200);//2小时,减少预检
    

    客户端:jQuery-Demo

    新建一个ajax.html,放到本地(最好是服务器某个目录下),代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>jQuery-Ajax-CORS-Demo</title>
    </head>
    <body>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <!--Microsoft CDN-->
    <!--http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.js-->
    <script>
        //http://api.jquery.com/jQuery.ajax/
    
        var url = "http://mini.lixiang80.com/v1/", token = "gwLTE1MDM2MzcwNTItMGM3ZWY2ZGFkMmMzNGYxNDk1ZmUwOTc1MGQ1MTM1YTc=bGl4aWFuZz";
    
        //list
        jQuery.ajax({
            method: "GET",
            url: url + "productAttrs/0",
            headers: {token: token}
        }).done(function (result) {
            console.log(result);
        });
    
        //store
        $.ajax({
            method: "POST",
            url: url + "productAttrs",
            data: {name: "产品属性", description: "描述"},
            headers: {token: token}
        }).done(function (result) {
            console.log(result);
        });
    
        //delete
        $.ajax({
            method: "DELETE",
            url: url + "productAttrs/465bc3a71db94a5cbb5f0726d63c4896",
            headers: {token: token}
        }).done(function (result) {
            console.log(result);
        });
    </script>
    
    </body>
    </html>
    

    如果还不明白,请看看权威的英文文档:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

    相关文章

      网友评论

          本文标题:跨域CORS问题简单完美解决

          本文链接:https://www.haomeiwen.com/subject/tbyudxtx.html