PHP SESSION跨页面传递失败解决方案


Posted in PHP onDecember 11, 2020

今天想用一个session来实现用户登录判断,也算是对之前session的探究,查了下资料session的运行机制如下:

session是服务器端的一种会话机制,当客户端的请求服务器创建一个session时,服务器会先检测该请求里面是否包含一个惟一的 sessionID,如果是,说明服务器已经为该用户创建过session,只要按照该sesionID检索出该用户的session供用户使用,如果没 有sessionID,服务器会为该用户新建一个带有唯一表示服sessionID的session。创建完成后,该sessionID会被服务器返回给 客户端,保存到客户端本地。

一般保存该session ID的机制是Cookie,但是由于Cookies可以被人为禁止,这就得保证Cookies被禁止之后,仍旧可以通过session进行会话,一般是通过url重写进行,表 现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,另一种是作为查询 字符串附加在URL后面,表现形式为http://..... /xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。

为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

另外是关于session失效的误区:

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动 对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。

对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

好了,废话说了一大堆,说session丢失的解决办法吧:

1、session_start();应该尽量放置到页面的顶部;

2、如果php.ini里面没有配置 session Autostart的话,每次会话之前,都得手动开启session:session_start();

3、session是php里面的超全局变量,跟$_GET,$_POST,$_SERVER一样,所以使用的时候必须大写:$_SESSION['username']=$username;

4、跨页面传递示例:a.php页面传递$_SESSION['username']到b.php:

a.php:

<?php
session_start();
$username=$_POST['username'];
$_SESSION['username']=$username;
?>

b.php:

<?php
session_start();
echo $_SESSION['username'];
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php4的session功能评述(三)
Oct 09 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 PHP
Yii使用find findAll查找出指定字段的实现方法
Sep 05 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 PHP
php实现的简单多进程服务器类完整示例
Feb 01 PHP
PHP基于进程控制函数实现多线程
Dec 09 PHP
PHP生成随机密码4种方法及性能对比
Dec 11 #PHP
通过代码实例解析PHP session工作原理
Dec 11 #PHP
深入解析PHP底层机制及相关原理
Dec 11 #PHP
基于PHP实现发微博动态代码实例
Dec 11 #PHP
PHP isset empty函数相关面试题及解析
Dec 11 #PHP
PHP数组实际占用内存大小原理解析
Dec 11 #PHP
PHP基于ip2long实现IP转换整形
Dec 11 #PHP
You might like
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
PHP中读写文件实现代码
2011/10/20 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
微信小程序按钮点击跳转页面详解
2019/05/06 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
学生发电厂实习自我鉴定
2013/09/22 职场文书
小学生寒假家长评语
2014/04/16 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript