美文网首页首页投稿(暂停使用,暂停投稿)程序员
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