美文网首页首页投稿(暂停使用,暂停投稿)程序员
jsonp系列(三)两种写法请求后端设置cookie,为啥一个可

jsonp系列(三)两种写法请求后端设置cookie,为啥一个可

作者: b12af9baadf4 | 来源:发表于2016-08-10 12:41 被阅读0次

本想介绍jsonp的jquery写法和sso单点登陆的相关内容,但是在这之前,我觉得有必要看一个问题。

我们知道,使用php生成cookie并发送给客户端很简单,代码如下:

如上,我们便可以向客户端发送后端生成的cookie。

那么接下来我们来看一个现象:

(1)http://a.com/a.php下面的代码如下:

(2)http://b.com/b.php下面的代码如下:

(3)http://b.com/index.php下面的代码如下:

(4)先访问http://a.com/a.php,页面输出111,然后访问http://b.com/index.php,我们看到cookie没有被设置成功,如图:

接下来,

(1)我们更改下http://a.com/a.php文件,代码如下:

(2)http://b.com/b.php下面的代码不变,如下:

(3)http://b.com/index.php下面的代码也不变,如下:

(4)先访问http://a.com/a.php,然后访问http://b.com/index.php,我们看到cookie被设置成功:

如图,我们可以看到cookie被设置成功了,那么为什么上一种情况不能成功设置cookie,下一中情况就成功设置cookie了呢?

有人会说:这很简单,你curl请求是服务器a请求服务器b,压根没有浏览器参与,所以服务器b不知道给哪个浏览器发送cookie。

但答案真的是这样吗?

其实,

正常情况下,a请求b,b返回结果给a,整个过程就结束了。

而上图中src的方式能成功设置cookie的原因:浏览器通过a.com上面的src地址访问b.com上面的index.php文件,b.com上的index.php返回cookie内容给浏览器,浏览器将接收到的cookie写到你本地的计算机目录里面去,整个过程就结束了。

那curl为什么不能成功设置cookie呢?浏览器通过a.com/index.php去curl访问b.com/index.php,确实是a服务器向b服务器发起了请求,但是此时b服务器生成了一个cookie返回给了a服务器,并且a服务器得到了b服务器的cookie,但是a服务器并没有把从b服务器得来的cookie发送给浏览器,所以,浏览器就没有没法存储b.com域下的cookie文件,要注意一点,a服务器其实拿到了b服务器生成的cookie文件,而浏览器没有拿到。

为了证明a服务器拿到了b服务器生成的cookie文件,我们用代码测试一下:

(1)http://a.com/a.php下面的代码如下:

#上图中,我们将接收到的cookie写入到了一个cookie.txt文件中,以用来检验里面是否有值

(2)http://b.com/b.php下面的代码如下:

(3)访问http://a.com/a.php后,我们看到a.php的当前目录下真的多出了一个cookie.txt文件,打开文件,我们看到内容如下:

cookie文件里面的内容,那不正是我们b.com服务器生成的cookie吗?

由此,可以看出,a.com服务器确实接收到了b.com生成的cookie。

所以,今天的这个问题,其实就是a服务器拿到了b服务器的cookie没有给浏览器,原因就是这样。

相关文章

网友评论

    本文标题:jsonp系列(三)两种写法请求后端设置cookie,为啥一个可

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