博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP跨页面SESSION丢失问题
阅读量:6940 次
发布时间:2019-06-27

本文共 1542 字,大约阅读时间需要 5 分钟。

hot3.png

很多人在PHP的开发中会出现SESSION跨页面丢失的问题,我曾经也遇到过,但是他自己好了 ^_^.

今天特别看了下,这种情况一般是用header跳转后才发生的,结合了PHP手册和网上的一些文章,做一下总结:

1.第一种情况是因为COOKIE丢失, COOKIE不可用的导致的。由于sessionId是保存到客户端的,跳转到页面的时候COOKIE取不到, sessionId丢失,SESSION也就丢失了。这种情况国内文章流行的解决办法是在跳转前后的两个页面的session_start()后面都加上session_id(SID);为什么加这个会有用呢?查看官方手册,对函数session_id()的描述是获取或者设置当前SESSION的ID。SID是一个常量,文档的描述是:The constant SID can also be used to retrieve the current name and session id as a string suitable for adding to URLs。不太明白这是什么意思,我们姑且把他当成一个唯一的字符串。在跳转之前的页面使用session_id(SID);就是把当前的sessionId设置为常量SID。跳转后页面再次使用session_id(SID), sessionId就存在了,而且和之前页面的SID一样,有了sessionId,就可以获取到session。

对于这种情况,还有一种做法,就是在跳转的URL里面把sessionId加上去。在一些网站上能看到类似 ?PHPSESSID=xxxxxxx的URL,这就是手动加sessionId。代码应该是:

sesstion_start();

$sessionId = session_id();

$url = '1.php?PHPSESSID='.$sessionId;

header('Location:' . $url);

这种做法没试过,原理知道了,解法可以有多种。

2.如果上面的你都试过了,session还是丢失,国内的文章基本都是让你加session_id(SID)。这个时候改用google搜搜国外的文章了。PHP SESSION有一个函数:session_write_close();不看这个函数还不知道一些东西。这个函数的作用是:写入session数据保、存并且结束session。在该函数的描述中说到:Session data is usually stored after your script terminated without the need to call session_write_close()。session数据“通常”是在脚本结束才保存数据,除非你调用了session_write_close(),有点坑爹。如果上面的方法没有解决,很可能是在你跳转之前SESSION没有保存,那么就需要在header之前调用session_write_close();并且在header之后加上一个exit(0);以保证脚本结束。这样有了双重保障,因为看到有人使用了session_write_close();以后还是丢失了,最后在header()后面加了exit(0)才解决问题的。

但是有时候我们没有加session_write_close();也没有exit(0);为什么session是正常的呢?这个地方很疑惑,不知道是不是除了 “session数据‘通常’是在脚本结束才保存数据”当中所说的通常以外的情况,希望有人高人能帮忙看看。

转载于:https://my.oschina.net/centerLife/blog/99300

你可能感兴趣的文章
配置jdk环境变量
查看>>
lamp架构
查看>>
今天,SAP 想和你一起思考一个问题
查看>>
云原生生态周报 Vol. 7 | Docker 再爆 CVE
查看>>
Twitter 宣布抛弃 Mesos,全面转向Kubernetes
查看>>
Ubuntu 15.10内建隐藏式滚动条
查看>>
Infortrend企业级智能AI存储一体机的应用场景
查看>>
Vtokendapp公链诠释
查看>>
What is Java Auto Update?
查看>>
JetBrains Rider 2018.3.4
查看>>
在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
查看>>
Python进阶之装饰器
查看>>
神器 Tmux 的超绝便利
查看>>
个人简历
查看>>
数据结构图之六(关键路径)
查看>>
如何做好企业级邮件系统的安全防范技术?
查看>>
我的友情链接
查看>>
虚拟化VMware之存储与虚拟主机管理(2)
查看>>
Linux下常用压缩解压缩、打包命令使用演示
查看>>
实现一个栈,Push,Pop,Min,并且保证时间复杂度为O(1)
查看>>