手机版

PHP跨域会话中共享cookie的方法分析

时间:2021-08-20 来源:互联网 编辑:宝哥软件园 浏览:

本文给出了一个例子来描述PHP中跨域共享cookie的方法。分享给大家参考,如下:

每个做过网络开发的人都知道cookies和会话。Cookies存储在客户端,而会话存储在服务器。

本文主要通过一些实际案例与大家分享踩坑,并以php语言为使用语言,重点讨论跨域cookie问题和会话服务器共享问题。

我们先来谈谈饼干

设置cookie无效

setcookie('sso ',' e 589 hr6 vno 8 k1cnqz4sp/lwgbhrke5 vckawqwl1tde 8 d4q 5 e7tw ',900);很多刚开始php的年轻人都会遇到这个问题。这段代码的初衷是将cookie sso的有效期设置为15分钟,但执行这段代码后就没有效果了。为什么呢?因为第三个参数expires指示的是过期时间节点,而不是有效时间,所以如果要将cookie设置为15分钟,正确的方法是获取当前时间戳加上15分钟。

Setcookie以及路径和域参数是常用的。强烈建议刚学过php的年轻人多看看手册。Php手册地址:http://php.net/manual/zh/index.php

获取cookie值无法获取

先看看这段代码

setcookie('sso ',' e 589 hr6 vno 8 k1cnqz4sp/lwgbhrke5 vckawqwl1tde 8 d4q 5 e7tw ',时间()900);var _ dump($ _ COOKIE[' SSO ']);为了解决这个问题,我们需要知道setcookie之后发生了什么。因为cookies存储在客户端,所以php是服务器语言。实际上,在setcookie之后,返回的http头中只添加了cookie的头信息,告诉客户端需要设置cookie,如下图所示:

php中setcookie返回的Http头

数组$_COOKIE保存客户端传递的COOKIE。自然,第一次刷新时,由于客户端没有对应的cookie值,$_COOKIE没有sso信息。第一次请求后,因为服务器设置了cookie sso,第一次请求的客户端有cookie sso信息,所以第二次请求会带来sso信息,服务器可以通过$_COOKIE获取值。

Cookie跨域问题

这可以说是cookie中的一个热门问题,通常在面试时都会谈到。

跨域业务需求大概是酱紫色:用户已经在a.com登陆,希望在b.com同步登陆。如果同一个主域比较简单,可以通过setcookie中的domain参数进行设置:比如x.a.com和xx.a.com可以设置为a.com,这样a.com所有的二级域名都可以共享这个cookie。出于安全原因,将域设置为a.com下的b.com是无效的。

那么真的没有办法做到这一点吗?这个有一些巧妙的技巧。这里有一个使用iframe的方法。

具体思路:在a.com下设置cookies后,嵌入iframe框链接b.com的页面,在b.com设置cookies后,嵌入a.com的页面。然后,通过parent.parent,您可以在最外层调用a.com的js方法,以便跳转或执行一些其他操作。具体的代码示例如下:

假设a.com有60页:login.php和callback.php,b.com有60页synclogin.php

Login.php电码:

?PHP $ SSO=' e 589 hr6 vno 8 k1cnqz4sp/lwgbhrke5 vckawqwl1tde 8 d4q 5 e7tw ';setcookie('sso ',$ SSO);登录成功.脚本类型='text/javascript '函数jump to(){ location . href=' http://a.com ';}/script iframe src=' http :3358 b.com/sync log in . PHP?sso=?php echo $ sso?'/iframeb.com的Synclogin.php网页

?phpsetbookie(' SSO ',$ _ GET[' SSO ']);iframe src=' http:3358a.com/callback.php'/iframea.com '的Callback.php页面

脚本类型=' text/JavaScript ' parent . parent . jumpto();/脚本代码似乎并不难。值得一提的是,这里嵌入了两个iframe,因为如果只使用一个iframe,也就是直接在b.com的synclogin.php调用父窗体的jumpTo方法,在某些浏览器中会出现未经许可的错误提示:错误:访问属性的权限被拒绝

这只是cookie跨域同步思想的一个演示。具体细节上还是有很多改进的。例如,iframe链接的页面可以变成静态页面,这比php动态页面要高效得多。还有参数验证,多个主域同时登录(如c.om)等。所以我就不在这里重复了。

cookie的总结到此结束。如果你觉得自己有所收获,可以通过扫描页面底部的代码给我奖励。谢谢O(_)O~

会议

$_SESSION没有值

此会话的使用与cookie略有不同,在使用会话之前必须调用session_start方法。否则,您将收到一个未定义的错误:注意:未定义的变量: _ session

会话存储在哪里

会话存储在服务器上,但是会话存储在哪里?php.ini中有一个session的save_path选项,可以设置存储目录。如果没有为此选项设置值,它将存储在系统默认的tmp目录中。可以通过sys_get_temp_dir方法获得一个默认的tmp目录。

例如,在mac下,php的会话通常存储在/var/tmp目录中。

session _ start();回声会话id();//本示例输出ipkl 446 enhanae 25 uq 92 c 28 u4lo 3 $ _ session[' name ']=' Tony ';$_SESSION['users']=array('tony ',' Andy ');您可以通过session_id方法获取当前会话号,并且可以通过该号检查会话文件。

$ sudo more/var/tmp/sess _ ipkl 446 enhae 25 uq 92 c 28 u4lo 3 name | s 33604: ' Tony ';用户| a:2: { i:0s:4:托尼’;i:1s:4:安迪’;}您可以清楚地看到会话存储数据的结构,其中的值通过序列化进行转换和存储。

会话也使用了cookie

会话不是存储在服务器上吗?为什么和饼干有关?其实想起来很简单,因为当客户端再次请求时,服务器怎么知道客户端的会话存储在哪个文件中呢?其实也是用cookie PHPSESSID来标识的。

php中会话的Cookie标识

Php在执行会话操作时会生成一个会话id,然后将这个值以cookie的形式保存在客户端,在图中是PHPSESSID。客户端下次请求时会带来这个PHPSESSID,服务器就可以知道当前客户端对应的会话文件

会话超时设置

Cookie超时设置相对简单,有一个参数是固定的。会话端有点小麻烦,cookie PHPSESSID的超时和服务器文件的超时都不能单独设置。详情请参考鸟哥的文章:如何设置30分钟到期的严格Session,真的很严格,请点赞。

会话服务器共享

这个问题类似于cookie的跨域,我很爱在面试的时候说。

以前做服务器集群的时候,我们也遇到过同样的问题,就是用户访问的时候处于正常登录状态,但是访问的时候没有登录。这个问题只是偶尔出现。追踪代码后发现会话没有得到对应的值,想起来就醉了:原来的服务器会话没有设置共享,会话存在于本地文件目录中,所以当用户访问另一台服务器时,自然无法得到会话。

解决方案并不难,通过共享存储在服务器之间共享。会话存储是通过使用redis来实现的。您可以通过php.ini配置文件或代码中的ini_set进行调整

ini_set('session.save_handler ',' redis ');ini_set('session.save_path ',' TCP ://127 . 0 . 0 . 1:6379 ");如果您需要使用redis进行存储,您需要在会话中注册保存处理程序来支持redis

php中的会话支持redis吗

完成此设置后,会话将保存在redis中,不同的集群服务器可以通过redis服务器共享。

好了,暂时就这些。后来我们会发现,新坑还会继续增加。

更多对PHP相关内容感兴趣的读者可以查看本网站专题:《PHP中cookie用法总结》、《php缓存技术总结》、《PHP数组(Array)操作技巧大全》、《PHP网络编程技巧总结》和《php字符串(string)用法总结》

希望本文对PHP编程有所帮助。

版权声明:PHP跨域会话中共享cookie的方法分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。