关于laravel框架的跨域请求/jsonp请求的理解
Posted PHP技术大全
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于laravel框架的跨域请求/jsonp请求的理解相关的知识,希望对你有一定的参考价值。
若文章排版不清或需要查看文中链接,请点击文章左下角的“阅读原文”
最近刚接触laravel框架,首先要写一个跨域的单点登录。被跨域的问题卡了两三天,主要是因为对跨域这快不了解,就在刚才有点茅塞顿开的感觉,我做一下大概整理,主要给一些刚接触摸不着头脑的看,哪里写得不对的,也请大神指点,言归正传:
1.先用通俗易懂的话说下原理和几种跨域的方式,因为网上一搜都是追对某一种方式的专业性解答,我是消化不了多少。
第一种:jsonp 方式,这是什么方式呢,先要说一说javascript,在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略),也就是说JS只能访问当前项目的页面。AJAX是基于XMLHttpRequest(这个请自行百度了解)实现的,所以AJAX 一类的请求肯定也是不能跨域请求的。 然后jsonp方式呢,虽然一般是再$.ajax 方法里面设置dataType: 'jsonp',但是发送请求出去的时候,已经跟ajax 没多少关系了,不管你设置type : get 还是 post ,它都是通过get发送请求的,可以说这个已经属于 jsonp 协议了,这是个非官方协议。发一下代码:
$.ajax({
url: 'http://lrz.laravel.com/auth/login',
type: 'get',
dataType: "jsonp",
jsonp: "callback",
data: {user_id:user_id,name:name},
success: function (data) {
console.log(data);
},
error:function()
{
alert("error");
}
})
当设置dataType 为 jsonp的时候就是jsonp请求了,然后 下面的 jsonp: "callback", 什么意思呢,jsonp方式会在客户端注册一个 js 的 callback方法,并通过GET方式发送到服务器,见连接:
Request URL:
http://lrz.laravel.com/auth/login?callback=jQuery21307739646233126818_1491549029207&user_id=1&name=%E5%90%95%E7%91%9E%E6%94%BF&_=1491549029208
jQuery21307739646233126818_1491549029207 这个方法就是客户端注册的。
然后服务器端怎么处理呢,接收 callback 的值,并返回一个JS方法的方式告知客户端,就是 return jQuery21307739646233126818_1491549029207(json_encode([1,2])); 这样的方式,客户端才能通过success: function (data) {} 获取到返回的值了,这就是通过JS注入的方式实现的 跨域请求,顺便我发一下 laravel 的返回方式:
$callback = $request->input('callback');
$arr = array('status'=>'200');
$user_id = $request->input('user_id');
$name = $request->input('name');
return response($callback.'('.json_encode($arr).')')->withCookie(Cookie::forever('name', $name))->withCookie(Cookie::forever('user_id',$user_id));
这么写是为了生成服务器端的cookie,用不着的小伙伴就忽略。
第二种方式就是通过html5 WebSocket标准 W3C方式,这个我一开始跟JSONP 弄混了,这个跟jsonp 又没关系了,这种方式通过设置一下头部信息就能实现跨域了,
服务器端主要设置这个值就能让其他的网址访问他了,用AJAX就能拿到服务器的数据了。关于laravel的开启跨域方式可以看这篇文章: http://www.tuicool.com/articles/3yEFVz2,我就不多说了。
我的需求是让用户中心在多个子站生成 cookie,然后cookie是服务器告知浏览器生成的,所以理论上讲POST是不能让其他网站生成cookie的,所以我这里必须使用jsonp拟跳转的方式,比如淘宝的用户登录就是用这种方式。 还有一种方式是post+动态生成iframe 局部提交页面,可以参考新浪的用户登录模式。不管哪种方式要想跨域生成cookie,就需要跳转页面。
有一篇文章说还有一种方法,跨域生成 cookie ,http://www.cnblogs.com/anai/p/4238777.html。 我没试过,有兴趣的朋友可以试试。
第一次写总结,哈哈,就写这么多了。
phper升级为大神并不难!
以上是关于关于laravel框架的跨域请求/jsonp请求的理解的主要内容,如果未能解决你的问题,请参考以下文章