php url传递参数_互联网系统(APP、网站等)通信基石——会话(PHP版)

一、会话概述

1.1、技术背景

互联网通信中采用的Http协议(建立TCP连接->Http请求->Http应答->断开TCP连接)本身是无状态的,即Http各请求之间是相互独立、互不相关的,而大量应用需要将各请求关联起来(如:用户登录系统购物、多次购买行为需要与该用户绑定),因此需要有一种机制实现Http各请求之间的关联

1.2、会话定义

用户端与服务端进行网络通信,用户从登录进入系统到注销退出系统,这一完整过程称为会话(Session);会话中,用户端与服务端进行的一序列通信处理(Http请求与应答)将始终与登录的具体用户相关联

1.3、实现原理

服务端收到用户端Http请求后,先从Http请求包中获取会话ID(如果没有,将自动生成一个会话ID),根据会话ID在内存中生成对应的散列表(如:PHP中的$_SESSION[])、检索上次保存的会话记录(如果检索不到,将自动生成一条与该会话ID绑定的空会话记录),将会话记录中的数据加载到散列表,通过散列表读写当前会话数据,最后请求处理结束时将散列表中的会话数据保存为会话记录、脚本结束时将当前的会话ID放入Http应答包发送给用户端(供下次Http请求使用)

二、会话ID的传递

从上述会话实现原理可知,会话ID将一序列Http数据包(请求/应答)关联起来,从而构成一个完整的会话,整个会话过程中需要在用户端与服务端通过Http数据包传递会话ID,具体传递方式有:Cookie方式传递、URL参数方式传递、数据内容方式传递,具体如下

2.1、Cookie方式传递

2.1.1、传递原理

Http请求过程:

用户端(如:浏览器)先从本地(内存或磁盘)读取保存的对应Cookie数据(名称、值、域名等),再将读取到的相应数据填写到Http请求数据包头的Cookie字段(首次请求时,由于本地无Cookie数据,该字段为空),而后将Http请求数据包发送到服务端;服务端收到Http请求数据包后解析时,将根据当前的会话名称匹配对应的Cookie名称,如果匹配到了、则读取对应的值(会话ID)作为当前的会话ID,如果匹配不到、将自动生成一个当前的会话ID;该过程中,用户端从本地读取保存的Cookie原则为:Cookie所声明的作用范围(由其路径与域共同决定)大于等于将要请求的资源所在的位置

Http应答过程:

服务端先将当前的会话名称、会话ID等数据分别填入Http应答数据包头的Cookie字段,而后将Http应答数据包发送到用户端;用户端收到Http应答数据包进行解析,再将解析得到的Cookie数据(名称、值、域名等)进行保存(至于保存到内存还是磁盘,由具体的程序设计决定,一般原则为:如果Cookie设置了有效时间,就保存到磁盘,否则将保存到内存)

2.1.2、环境配置

用户端配置:

使用Cookie方式传递时,用户端必须开启Cookie的接受与发送功能,否则将不能实现该传递功能;不同用户端开启的方法不一样,以下为IE浏览器开启Cookie接受与发送功能的相关步骤:

菜单栏“工具”->“Internet选项”->“隐私”->“选择Internet区域设置”->选择“接受所有Cookie”->点“确定”关闭

服务端配置:

使用Cookie方式传递时,服务端必须开启Cookie的接受与发送功能(一般默认为开启状态),否则将不能实现该传递功能;开启方法如下:

方法1:配置文件“php.ini”中的“session.use_cookies”配置项设置为“1”->重新启动服务器(如:Apache)

方法2:用ini_set()函数直接在PHP脚本中将“session.use_cookies”配置项设置为“1”

2.1.3、案例演示

创建如下PHP脚本文件(ByCookie.php):

/*

* ByCookie.php

*/

//打开错误及告警提示(不打开E_NOTICE,否则下面使用$_SESSION会有告警)

error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));

//error_reporting(E_ALL | E_STRICT);

//设置会话名称

session_name('TransID');

//启动新会话或者重用现有会话

$startRst = session_start();

if (!$startRst)

{

echo 'Session start fail!'.'
';

return ;

}

//获取当前会话名称

$sessName = session_name();

echo 'session name:'.$sessName.'
';

//获取当前会话ID

$sessId = session_id();

echo 'session id:'.$sessId.'
';

//读写当前会话数据

echo 'Last request,session data:'.$_SESSION['count'].'
';

if (empty($_SESSION['count']))

{

$_SESSION['count'] = 1;

}

else

{

$_SESSION['count']++;

}

echo 'This request,session data:'.$_SESSION['count'].'
';

?>

在浏览器中用多个页面顺序打开上述“ByCookie.php”文件多次,便可以看到被多次传递的同一个会话ID及相关数据,结果如下:

50d9b6023f0bdfa1f149f5e4a0845f9f.png
e79b53717292e390bff75d168127c212.png

2.2、URL参数方式传递

2.2.1、传递原理

首次请求时,服务端将当前的会话名称及会话ID放入Http应答数据包响应正文(作为参数附加到URL后)中发送到用户端;用户端通过URL触发连接请求(如:点击链接或提交表单)时,会话名称及会话ID被填写到Http请求数据包头的URL字段(作为参数附加到URL后),而后将Http请求数据包发送到服务端;服务端收到Http请求数据包后,通过$_GET[]全局变量即可得到请求数据包头URL字段中的参数(会话名称及会话ID);如果还有需要,服务端再将会话名称及会话ID放入Http应答数据包响应正文(作为参数附加到URL后)中发送到用户端、供用户端再次通过URL触发连接请求

2.2.2、案例演示

在同一目录下创建如下2个PHP脚本文件(ByURLSend.php及ByURLRcve.php):

文件1(ByURLSend.php):

/*

* ByURLSend.php

*/

//打开错误及告警提示(不打开E_NOTICE,否则下面使用$_SESSION会有告警)

error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));

//error_reporting(E_ALL | E_STRICT);

//设置会话名称

session_name('TransID');

//启动新会话或者重用现有会话

$startRst = session_start();

if (!$startRst)

{

echo 'Session start fail!'.'
';

return ;

}

//获取当前会话名称

$sessName = session_name();

echo 'session name:'.$sessName.'
';

//获取当前会话ID

$sessId = session_id();

echo 'session id:'.$sessId.'
';

//读写当前会话数据

echo 'Last request,session data:'.$_SESSION['count'].'
';

if (empty($_SESSION['count']))

{

$_SESSION['count'] = 1;

}

else

{

$_SESSION['count']++;

}

echo 'This request,session data:'.$_SESSION['count'].'
';

?>

==session_id();?>">URL参数方式传递(方法1)

">URL参数方式传递(方法3)

文件2(ByURLRcve.php):

/*

* ByURLRcve.php

*/

//打开错误及告警提示(不打开E_NOTICE,否则下面使用$_SESSION会有告警)

error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));

//error_reporting(E_ALL | E_STRICT);

//设置会话名称

session_name('TransID');

//获取当前会话名称

$sessName = session_name();

//获取当前会话ID

$sessId = $_GET[$sessName];

if ('' == $sessId)

{

echo 'Session id transmits fail!'.'
';

return ;

}

//设置当前会话ID

session_id($sessId);

//启动新会话或者重用现有会话

$startRst = session_start();

if (!$startRst)

{

echo 'Session start fail!'.'
';

return ;

}

//获取当前会话名称

$sessName = session_name();

echo 'session name:'.$sessName.'
';

//获取当前会话ID

$sessId = session_id();

echo 'session id:'.$sessId.'
';

//读写当前会话数据

echo 'Last request,session data:'.$_SESSION['count'].'
';

if (empty($_SESSION['count']))

{

$_SESSION['count'] = 1;

}

else

{

$_SESSION['count']++;

}

echo 'This request,session data:'.$_SESSION['count'].'
';

?>

在浏览器中打开“ByURLSend.php”,便能看到如下结果:

a672a6006fe240f8cafd639221803490.png

点击不同的链接,便可以看到在不同页面间传递的同一个会话ID及相关数据

bbdcd8c9a7cd888d833e264edebeb8f9.png

2.3、数据内容方式传递

2.3.1、传递原理

首次请求时,服务端将当前的会话名称及会话ID放入Http应答数据包响应正文(通常以字段值的方式放置)中发送到用户端;用户端通过POST方法触发Http请求时,会话名称及会话ID作为Http请求数据包的请求数据发送到服务端;服务端收到Http请求数据包后,直接解析Http请求数据包的请求数据即可得到会话名称及会话ID;如果还有需要,服务端再将会话名称及会话ID放入Http应答数据包响应正文(通常以字段值的方式放置)中发送到用户端、供用户端再次POST方法触发Http请求

2.3.2、案例演示

在同一目录下创建如下2个PHP脚本文件(ByDataSend.php及ByDataRcve.php):

文件1(ByDataSend.php):

/*

* ByDataSend.php

*/

//打开错误及告警提示(不打开E_NOTICE,否则下面使用$_SESSION会有告警)

error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));

//error_reporting(E_ALL | E_STRICT);

//设置会话名称

session_name('TransID');

//重用现有会话;

$startRst = session_start();

if (!$startRst)

{

echo 'Session start fail!'.'
';

return ;

}

//获取当前会话名称

$sessName = session_name();

echo 'session name:'.$sessName.'
';

//获取当前会话ID

$sessId = session_id();

echo 'session id:'.$sessId.'
';

//读写当前会话数据

echo 'Last request,session data:'.$_SESSION['count'].'
';

if (empty($_SESSION['count']))

{

$_SESSION['count'] = 1;

}

else

{

$_SESSION['count']++;

}

echo 'This request,session data:'.$_SESSION['count'].'
';

?>

文件2(ByDataRcve.php):

/*

* ByDataRcve.php

*/

//打开错误及告警提示(不打开E_NOTICE,否则下面使用$_SESSION会有告警)

error_reporting((E_ALL | E_STRICT) & (~E_NOTICE));

//error_reporting(E_ALL | E_STRICT);

//设置会话名称

session_name('TransID');

//获取当前会话名称

$sessName = session_name();

//获取当前会话ID

$sessId = $_POST[$sessName];

if ('' == $sessId)

{

echo 'Session id transmits fail!'.'
';

return ;

}

//设置当前会话ID

session_id($sessId);

//重用现有会话;

$startRst = session_start();

if (!$startRst)

{

echo 'Session start fail!'.'
';

return ;

}

//获取当前会话名称

$sessName = session_name();

echo 'session name:'.$sessName.'
';

//获取当前会话ID

$sessId = session_id();

echo 'session id:'.$sessId.'
';

//读写当前会话数据

echo 'Last request,session data:'.$_SESSION['count'].'
';

if (empty($_SESSION['count']))

{

$_SESSION['count'] = 1;

}

else

{

$_SESSION['count']++;

}

echo 'This request,session data:'.$_SESSION['count'].'
';

?>

在浏览器中打开“ByDataSend.php”,便能看到如下结果:

8ccb4215e50f07d115b3835c135a4acd.png

点击“数据内容方式传递”按钮,便可以看到在不同页面间传递的同一个会话ID

2d34b5c01c67421e5c1af41554fe17a2.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十年探索,云上明灯,re:Invent再启掀产业风暴

15年前,IT基础设施有着太多的限制,成本高、反应慢、灵活度低,对于企业的创新与发展有着很大的伤害。当亚马逊推出全球第一个云计算服务简单存储 Amazon S3时,可能没有太多人相信,这些内容将会开启一个新世界的大门&…

用手机「3D探店」是种什么体验?

简介: 未来场景尽在眼前!阿里云3D全景网站通过云端算法技术自动建模,将线下场景1:1真实还原到线上,让用户足不出户就可以感受到真实的3D空间漫游效果。 在手机里用3D探店打卡是种什么样的体验? 走进商场,每…

mysql bin oct_python 讲解进制转换 int、bin、oct、hex

相关免费学习推荐:python视频教程原理十进制转n进制都可以使用倒除法:对十进制进行除n的运算,直到商为0为止,然后将各个步骤中得到的余数倒着写出来.n进制转十进制:(例子:二进制转十进制)101001 > 2^5 …

java设置字体大小和颜色_Java 设置Excel图表背景填充(颜色、图片填充)

本文介绍通过Java程序来设置Excel图表背景填充的方法,填充时,可设置颜色填充或者加载图片填充;填充区域可设置整个图表区域或者绘图区域。设置方法参考以下内容。使用工具:Free Spire.XLS for Java(免费版)…

英特尔TCI技术落地,锐捷网络发布OCS终端云化新品

编辑 | 宋慧 出品 | CSDN 云计算 2021 年 6 月,国内一直深耕桌面虚拟化的厂商锐捷正式发布了新一代云桌面解决方案——锐捷三擎云桌面解决方案( “精耕细作”桌面云市场的锐捷,重磅发布三擎云桌面 ),其中三擎指的是终端…

从理念到实践跳跃式演进! 云的原生“免疫系统”如何有机作战?

简介: 7月16日,以“原生安全二倍速:全面融入基础设施”为主题的阿里云原生安全线上专题活动收官,诠释由云而生的能力如何解决数字经济时代的安全新挑战,让高等级安全作为一种基础设施,成为数字业务发展的“…

安卓开发替换json字符串中的数据_22个JavaScript开发技巧合集

作者:kancloud转发链接:https://www.kancloud.cn/dennis/tgjavascript/241855开发技巧1、使用var声明变量如果给一个没有声明的变量赋值,默认会作为一个全局变量(即使在函数内赋值)。要尽量避免不必要的全局变量。2、行尾使用分号虽然JavaScr…

Python静态类型解析工具简介和实践

简介: Python是一门强类型的动态类型语言,开发者可以给对象动态指定类型,但类型不匹配的操作是不被允许的。动态类型帮助开发者写代码轻松愉快,然而,俗话说:动态一时爽,重构火葬场。动态类型也带…

拥抱创新二十载,微软“创新杯”持续孵化中国青年开发者智慧创意

12月13日,2022 第二十届微软“创新杯”全球学生大赛(以下简称“创新杯”)中国区总决赛结果正式揭晓。来自西安的 Silent Talk 团队凭借Silent Talk—— Speech Rehabilitation Training 项目,在 22 支决赛队伍中脱颖而出&#xff…

AI和大数据结合,智能运维平台助力流利说提升核心竞争力

简介: 简介:本文整理自数智创新行——智能运维专场(上海站),流利说最佳实践演讲:《基于SLS千万级在线教育平台统一监控运营实践》 作者: 孙文杰 流利说运维总监 元乙 阿里云智能技术专家 优质…

核桃编程:前端可观测性建设之路

简介: 随着核桃编程业务的快速增长,核心应用的系统规模和系统复杂度也在经历翻天覆地的变化。核桃技术团队不断通过新兴的技术手段维护整套系统架构的技术先进性。在3 年时间里,技术团队至少对整体系统架构进行了 6 次以上的重大重构&#xf…

少拿游戏来骗我,虚幻引擎5上的《黑客帝国》全新体验,画面帅到爆

整理 | 禾木木 出品 | CSDN云计算(ID:CSDNcloud) 近日,由 Epic Games 发行的虚幻引擎 5 体验上线了。 以华纳兄弟公司电影《黑客帝国》为背景,由拉娜 沃卓斯基担任编剧和导演,基努 里维斯和凯瑞 - 安 莫…

python变量使用前必须先声明、并且一旦声明_初学者学习Python的30天‍-第18天-文件处理...

前文最近不是出了一个30天的Python教程,有很多人私信我说没有资料怎么跟着学习,现在他来了https://www.bilibili.com/read/cv9383238今天,我探讨了如何使用Python处理文件并与文件进行通信。这些天来,我一直在探索和分享各种Pytho…

金融数据智能峰会 | 数据规模爆炸性增长,企业如何进行精准决策?云原生数据仓库数据化运营实战分享

简介: 在日前的2021阿里云金融数据智能峰会——《云原生驱动数智化运营的“增长黑马”》专场上,阿里云数据库资深技术专家魏闯先 从数据价值链路角度切入,为大家解读云原生数据仓库如何支撑数据化运营、全链路营销和阿里集团双11业务&#xf…

redistemplate.opsforvalue 设置不过期_民法典即将实施!“离婚冷静期”倍受关注

还有不到一个月,“离婚冷静期”就要落地了。2021年1月1日起,《中华人民共和国民法典》(以下简称“《民法典》”)将正式施行。作为与老百姓日常生活关系最为紧密的一部法律,《民法典》的制定和施行备受关注,其中尤以“离婚冷静期”…

到底是无线最难?还是核心网最难?

作者 | 小枣君来源 | 鲜枣课堂今天这篇文章,我们来探讨一个通信行业的长期争议话题——到底是无线最难?还是核心网最难?众所周知,通信行业虽然对外统称“通信”,但实际上,内部却分为三个细分板块&#xff0…

谈谈C++新标准带来的属性(Attribute)

简介: 从C11开始,标准引入了一个新概念“属性(attribute)”,本文将简单介绍一下目前在C标准中已经添加的各个属性以及常用属性的具体应用。 作者 | 寒冬 来源 | 阿里技术公众号 从C11开始,标准引入了一个新概念“属性(attribute)…

mmap函数_分析由 mmap 导致的内存泄漏

背景一个程序链接 TCMalloc ,同时调用 mmap / munmap 管理一部分较大的内存通过 TCMalloc 的统计信息,判断内存泄漏不是由 new / malloc 等常规接口导致的因此怀疑是 mmap 导致的内存泄漏hookhook mmap / munmap 记录下每一次调用,可以分析出…

如何一站式快速构建企业全场景数据库管理平台?

简介: Gartner 的报告显示预计到2022年将有75%数据库将采用云数据库,与此同时,IDC预计到2024年传统部署数据库市场将达到13亿美元,企业数字化转型升级,积极拥抱开源、云原生数据库成为重要趋势,也是必然选择…

编程能力差,学不好Python、AI、Java等技术,90%是输在了这点上!

据了解,超90%的人在学习Python、Java、AI等技术时,都是在网上随便找个入门的教程就开始学起来。然而多数人在看了不少教程后,还是很难独立完成项目,甚至反思自己为什么学了这么久编程能力还是这么差!因为你在刚刚开始学…