0

0

PHP 不得不提的 session 与 cookie

藏色散人

藏色散人

发布时间:2019-09-11 11:25:55

|

3138人浏览过

|

来源于learnku

转载

PHP 不得不提的 session 与 cookie

sessioncookie 是什么?

session 与 cookie 属于一种会话控制技术。常用在身份识别,登录验证,数据传输等。举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠。这时候,我们怎么识别这个会员卡真实有效的呢?当我们将会员号给到收银员,收银员根据我们提供的会员号,输入到系统中,系统根据这个会员号去查询,如果查询到了就证明这个会员号是真实存在的。这里的会员号就好比 cookie 与 session. 会员系统就好比服务器端,收银员就好比客户端.

 为什么会用到 session 与 cookie 呢?

根据上述的例子,我们知道 session 与 cookie 是可以干什么的了,那为什么必须用这个来实现呢?这里就有必要了解一下 http 应用传输协议的特点了。由于 http 协议是无状态的,即浏览器去请求了一个网页,这时候就是一个 http 请求,当服务端接收到请求之后,返回客户端需要的数据,在这过程中浏览器与服务器是建立了一个连接的。但是当服务端返回数据,客户端收到数据之后,他们的这种连接关系就断开了。下次浏览器再去发送请求的时候,又是重新建立一个连接,这两个链接没有任何关系。试想一下,当我们登录一个商场系统的时候,进入首页做了登录操作,但是我们下单或者加入购物车的时候,还需要登录,每访问一个页面就要登录,是不是很繁琐同时也是很不科学的,万一我们加入购物车的商品,我们点击下单了,下单页面要登录而且还无法正确的反馈出你下单时的那些商品.

 Http 特点

立即学习PHP免费学习笔记(深入)”;

1.http 协议支持客户端 / 服务端模式,也是一种请求 / 响应模式的协议。

2. 无连接。所谓的无连接就是服务器收到了客户端的请求之后,响应完成并收到客户端的应答之后,即断开连接。限制每次的连接只处理一次请求。从而节省传输时间。

3. 无状态。http 协议对事务的处理没有记忆能力。也就意味着如果需要前面的信息,只能重传,这无形之中增加数据的传输量。这种方式某种方面上讲解放了服务器,但是却不利于客户端与服务器的连接。为了弥补这种不足,产生了两项记录 http 状态的技术,一个叫做 Cookie, 一个叫做 Session,后面我们再细讲它们。

4. 简单快捷:所谓的简单快捷是指客户端向服务器请求服务时,一般来说只需要传输请求方法和路径,就能进行访问

5. 灵活:这里主要指的是客户端可以通过 http 协议传输任意类型的数据。比如传输.jpg 文件、.ppt 文件等等,只需要设定 content-type 就可以进行传输。

 Cookie

 cookie 的基本概念

cookie 是远程浏览器存储数据以此追踪用户和识别用户的的机制,从实现来说,cookie 是存储在客户端上的一个数据片段。

 cookie 的运行原理与存储机制

. 运行原理

1. 客户端向服务端发起一个 http 请求.

2. 服务端设置一个创建 cookie 的指令,响应给客户端.

3. 客户端收到服务端响应的指令,根据指令在客户端创建一个 cookie.

4. 挡下一次请求时,客户端携带这个 cookie 向服务端发送请求.

. 存储机制

总的来说,cookie 在客户端存储的形式有三种,不同的浏览器的存储机制不同,存的 cookie 也不同.

1. 文件存储。浏览器会针对不同的域,在磁盘的对应目录创建一个单独的文件,来存储该域下面的 cookie 值.

2. 内存存储。当浏览器关闭时,该 cookie 随之消失。根据下面的创建语法,当我们未设置过期时间时则会出现这种情况.

3.flash 存储。这种存储方式是永久存储在磁盘中,即使通过浏览器删除一些数据都是无法删除该方式存储的 cookie,如果需要删除,可能通过磁盘的方式.

 cookie 的设置

Bool setcookie(string $name[, string $values, $expire=0[,string $path[,string $domain[, bool $secure = false[, bool $httpOnly = false]]]]] );

$name:cookie存储的名称,必填选项.

$values:cookie存储的值。这里需要注意的是,当把该值设置为false时,客户端会尝试删除这个cookie值,因此在要将值这是为true或者false的时候,我们用另外的值来代替,例如true用1代替,false用0来代替.

$expire:cookie的过期时间,秒为单位,当该值被设置时,定时删除;当该值没有设置时,该值是永久有效的.该值设置为小于当前时间时,会出发浏览器的删除机制,会自动删除cookie.

$path:cookie有效的目录,默认的目录是"/",即表示当前的正个域名都生效.

$domain:cookie的作用域名,默认的是当前域名有效,如果需要设置直接填写生效的域名即可.需要注意的是IE浏览器有长度限制,当只有大于5的时候才会生效.

$secure:cookie的加密处理,当设置为true的时候,需要使用HTTPS协议,才会生效.

$httpOnly:决定cookie是否只使用http协议,当设置为1或者true,其他非http协议是无法操作cookie的。例如我们未设置的时候,我们JavaScript是可以对cookie进行设置的.这样一定程度上保证了安全性.这种情况需考虑浏览器是否支持该配置项.

. 设置 cookie 的函数还有 setrawcookie () 函数,只不过该函数不会对值 进行 urlencode 序列号.

. 有时候,我们可能遇到这种情况,我们在这个页面设置了 cookie,但是去刷新页面获取 cookie,按理说是会获取到 cookie 的,但实际情况是无法获取到,这是由于 cookie 运行机制导致,PHP 创建了 cookie 这个指令,告诉浏览器,你需要执行这个指令了,这时候浏览器才会去执行这个指令,因此是无法获取到 cookie 的.

. 在设置 cookie 之前,不能有任何输出.

// 实现方式一
setcookie($cookie,"hello,world!", 3600);
// 实现方式二
header("header("Set-Cookie: testcookie=中文; path=/; domain=.sunphp.org; expires=".gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT",time()+9600));");
// 两则的作用是一样的,setcookie是PHP内置函数,是对http协议的操作封装。

 cookie 的获取

$_COOKIE['$cookeName'];

 cookie 的应用

. 用户身份识别

. 数据传输

. 登录控制 (是否登录、单点登录)

 cookie 跨域设置

我们都知道,在前端开发中时常会遇到 ajax 跨域问题,我们解决的方式有很多种,可以参考这篇文章传送门 1,传送门 2,cookie 跨域我们可以参考 p3p 传输协议传送门

 cookie 使用的注意事项

magento(麦进斗)
magento(麦进斗)

Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的

下载

. 数量限制,客户端对每一个 domian 下的 cookie 是有数量限制的,不是创建任意数量就行.

. 安全性,根据上面的创建语法,我们可以得知,当我们未设置 $httpOnly 值得时候,非 http 协议是可以操作 cookie 的值的,例如 JavaScript 通过 cookie ($cookieName). 而且一些抓包工具也是可以抓取到 cookie 的,还有就是 cookie 存储在客户端的文件中,如果获取到这个 cookie,也是可以对 cookie 做一些操作的。为了防止别人可以拷贝 cookie 文件,进行恶意操作,可以对 cookie 进行加密处理.

数据传输:当 cookie 数量很多,数据很大的时候,其实对于带宽是有消耗的。比较 http 传输都需要带宽,当 http 传输的数据量大了,带了的带宽消耗就大.

 Session

 运行原理与存储机制

. 运行原理

1. 客户端向服务端发起请求,建立通信

2. 服务端根据设置的 session 创建指令,在服务端创建一个编号为 sessionid 的文件,里面的值就是 session 具体的值 (组成部分 变量名 | 类型 : 长度:值).

3. 服务端将创建好的 sessionid 编号响应给客户端,客户则将该编号存在 cookie 中 (一般我们在浏览器存储的调试栏中会发现 cookie 中有一个 PHPSESSID 的键,这就是 sessionid,当然这个名称,我可以通过设置服务端是可以改变的).

. 当下一次请求时,客户端将这个 sessionid 携带在请求中,发送给服务端,服务端根据这个 sessionid 来做一些业务判断.

. 存储机制

1. 存储方式.session 默认是文件存储的。我们可以通过 php.ini 的配置来设置存储驱动传送门

2. 生命周期。当我们未设置 session 的生命周期时,当浏览器关闭之后存储在客户端的 phpsessid 自动消失,因为它是存在内存,下次建立连接的时候会重新创建一个 phpsessid. 之前的 session,PHP 会自动的根据垃圾回收机制自动删除。这里我们可以根据 session_set_cookie_params ($expire) 函数来设置一个生命周期;

 session 的设置

session_start();
$_SESSION = $values;

. session_start () 设置之前,不能有任何输出

 session 的获取

$_SESSION['values'];

 session 的删除

// 只是单纯的给重新赋了一个空的值
$_SESSION['values'] = '';
// 该函数是清空所有的session,慎用!
session_destroy();
// 连values这个session键都会删除
unset($_SESSION['values']);

 session 的使用场景

. 用户身份识别

. 数据传输

. 登录控制 (是否登录、单点登录)

 session 的注意事项

. 安全性,sessionid 是按照一定的算法生成,要保证 session 的值唯一性和随机性.

. 客户端禁用 cookie,根据上面 session 的运行原理可以得出,session 的存储于传送还是依赖于客户端,因此当客户端禁用 cookie 时,客户端是无法保存 PHPSESSID 的,这时候可以通过 url 重写或者表单来实现 session 的传输.

. 存储优化,按照上面的 session 创建,所有的 session 都会创建在一个目录下面,同时有的无效 session 在垃圾回收机制时间内还不会删除,当一台服务器配置的站点较多时,这时候会生成很多的 session 文件,导致我们读取速度变慢,我们可以设置 session 的存储目录级别,save_path 函数. 一般大型的项目 (如分布式的项目), 可以使用其他的存储方式,如数据存储,内存存储.

 session 与 cookie 的区别

. session 存储在服务端,cookie 存储在客户端.

.cookie 的创建指令由服务端设置.

.session 的 sessionid 需要客户端存储.

 cookie 与 session 的几个误区

. 客户端禁止 cookie,session 无法使用?

使用url重写或者表单提交可以实现.

.session 和 cookie 的安全性比较,session 存在客户端安全更高?

由于cookie是存在客户端的,相对来说安全性是要低一些,不过在创建的时候可以设置$httpOnly值.

由于cookie与session是相互关联的,获取到cookie一定程度上获取到了session,同样可以操作session.

.cookie 与 session 是不是在浏览器关闭的时候会消失?

这需要查看存储机制了。cookie可以存文件,内存,flash.存内存当然浏览器关闭则消失了;session由于垃圾回收机制,当在垃圾回收机制内是不会删除的,除非你代码中显示的做了删除操作.

.cookie 是存储在客户端中,如何增加其安全性?

我们可以在设置cookie的时候,增加一些特殊参数,如客户端信息ip、浏览器信息等.

. 当 cookie 存在客户端的文件中,是不是每个浏览器获取到这个文件都可以进行操作?

要看浏览器之间对cookie的管理机制是不是一样.

相关推荐:《PHP教程

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2749

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1677

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1538

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

1015

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1464

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1569

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

1

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 9.6万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号