以下是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~
使用jsonp就直接跨域了,并不需要再写跨域头
可是我用的是nginx ,我将例子在弄下
JSONP 不需要设置 header('Access-Control-Allow-Origin:*');
跨域解决方案:
JSONP解决GET跨域
设置Access-Control-Allow-Origin响应头
Apache反向代理
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:你的白名单域名');