AJAX 中 Jsonp 请求是不是就可以不用考虑header的问题

以下是js 代码

    /**
     * [Jsonp 简单的封装jsonp]
     * @author         ShaoWeiPu 
     * @CreateTime    2016-12-01T11:18:45+0800
     * @param                               {[type]} method   [description]
     * @param                               {[type]} url      [description]
     * @param                               {[type]} data     [description]
     * @param                               {[type]} userOpts [description]
     */
    Jsonp: function(method, url, data, userOpts) 
    {
        data.csrf_token =  $('meta[name="csrf-token"]').attr('content') ;
        options = $.extend({
            type: 'get',
            url: url,
            data: data,
            dataType: "JSONP",
            xhrFields:{withCredentials:true},
            async: false,
            timeout: 3000,
            cache: false,
            jsonp:"Callback",
            jsonpCallback:"jsonCallback",
            contentType: "application/json",
/*            success: function(data,textStatus){  
                console.log(data);
            }, error: function (e) {
               
            }*/

        }, userOpts);
        return $.ajax(options);
    },

然后是 php 服务端的

      // ConstConf::getOriginToC(); // 跨域处理包
      // header('Access-Control-Allow-Origin:*');       
    if (isset ($_GET['Callback'])) 
    {
        $res =['code'=>'1'];
        header("Content-Type: application/json");
        echo $_GET['Callback']."(".json_encode($res).")";
    }
die;
       

发现我注释掉 header('Access-Control-Allow-Origin:*'); JSONP 的请求依然能够过来,另外问问诸位都是怎么解决跨域问题的呀?

我发现我直接使用ajax 中的json的话发现Session会不一样,所以使用了jsonp的形式完成跨越,但是看到jsonp貌似是所有的知道此链接的都可以进行访问呀,那么我该如何进行控制呢?

感谢诸位大神指导 O(∩_∩)O~

阅读 8k
5 个回答

jsonp本质是利用<script>标签src跨域能力做到的,与ajax是两种不同的方式。

JSONP原理:
http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

你知道原理之后你就会知道,要返回JSONP数据的话,一定需要一个 callback(json) 这样的形式,才能被正确调用。既然你服务器写了这样的形式,那么所有知道链接的都可以jsonp这个接口。

解决方案:

不用jsonp,用header做白名单。
header('Access-Control-Allow-Origin:你的白名单域名');

JSONP 不需要设置 header('Access-Control-Allow-Origin:*');
跨域解决方案:
JSONP解决GET跨域
设置Access-Control-Allow-Origin响应头
Apache反向代理

可是我用的是nginx ,我将例子在弄下

使用jsonp就直接跨域了,并不需要再写跨域头

使用jsonp就是在客户端使用script来模拟请求,直接用script标签来拉取url的内容,前提url是支持get方式的,或者也可以通过其他支持标签来拉取,这种方式一般不支持header设置,后端也不需要设置跨域请求header

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题