四、PHP基础——会话技术Cookie 和 Session

会话技术初步认识

会话技术介绍
web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

HTTP协议的特点是无状态/无连接,当一个浏览器连续多次请求同一个web服务器时,服务器是无法区分多个操作是否来自于同一个浏览器(用户)。会话技术就是通过HTTP协议想办法让服务器能够识别来自同一个浏览器的多次请求,从而方便浏览器(用户)在访问同一个网站的多次操作中,能够持续进行而不需要进行额外的身份验证。

会话技术分类
1)cookie技术
Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件(HTTP协议响应头),它可以包含有关用户的信息。无论何时用户链接到服务器(HTTP请求携带数据),Web 站点都可以访问 Cookie 信息
2)session技术
Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。Session技术是将数据保存到服务器端,无论何时用户链接到服务器,Web站点都可以访问Session信息:SESSION技术的实现是依赖COOKIE技术的。

两种会话技术区别
1)安全性方面
a)Session存储服务器端,安全性高
b)Cookie存储浏览器端,安全性低
2)数据大小方面
a)Cookie的数量和大小都有限制(20个/4K)
b)Session数据存储不限
3)可用数据类型
a)Cookie只能存储简单数据,数值/字符串
b)Session可以存储复杂数据(自动序列化)
4)保存位置方面
a)Cookie保存在浏览器上
b)Session保存在服务器上

COOKIE的基本使用

COOKIE原理
COOKIE技术:服务器将数据通过HTTP响应存储到浏览器上,浏览器可以在以后携带对应的COOKIE数据访问服务器。

1、第一次请求时,PHP通过setcookie函数将数据通过http协议响应头传输给浏览器
2、浏览器在第一次响应的时候将Cookie数据保存到浏览器
3、浏览器后续请求同一个网站的时候,会自动检测是否存在Cookie数据,如果存在将在请求头中将数据携带到服务器
4PHP执行的时候会自动判断浏览器请求中是否携带Cookie,如果写到,自动保存到 $_COOKIE5、利用$_COOKIE访问Cookie数据

在这里插入图片描述

设置COOKIE信息
Setcookie函数用来设定COOKIE信息
Setcookie(名字,值)

1)cookie名的设置:字符串,第一个参数
2)cookie值的设置:第二个参数
3)cookie值的类型要求:必须是简单类型中的整数或者字符串
在这里插入图片描述

读取COOKIE信息
1)$_COOKIE数组的使用
在这里插入图片描述

COOKIE(会话技术)能够实现跨脚本共享数据
COOKIE高级使用
COOKIE生命周期
COOKIE生命周期:COOKIE在浏览器生存时间(浏览器在下次访问服务器的时候是否携带对应的COOKIE)

1)默认(不设定)时的生命周期:不设定周期默认是关闭浏览器(会话结束)
2)设定为一个常规日期戳的周期:通过setcookie第三个参数可以限定生命周期,是用时间戳来管理,从格林威治时间开始
在这里插入图片描述

浏览器关闭后重新查看
在这里插入图片描述

3)设定为“0”的周期:在第三个参数设定生命周期的时候,用0代替时间戳:表示就是普通设置,会话结束过期
在这里插入图片描述

4)删除一个cookie的做法:服务器没有权限去操作浏览器上的内容(不可能删除)。可以通过设定生命周期来让浏览器自动判定COOKIE是否有效:无效就清除
4.1 清空COOKIE数据内容
在这里插入图片描述

4.2 设定时间戳过期
在这里插入图片描述

COOKIE作用范围
作用范围:不同的文件夹层级中,设定的COOKIE默认是在不同的文件夹下有访问限制。上层文件夹中设定的COOKIE可以在下层(子文件夹)中访问,而子文件夹中设定的COOKIE不能在上层文件夹中访问。

1)默认(不设定)的范围:就是使用COOKIE默认的作用范围
在这里插入图片描述

2)设定为“/”的含义:告知浏览器当前COOKIE的作用范围是网站根目录
Setcookie(名字,值,生命周期,作用范围)
在这里插入图片描述

COOKIE跨子域
跨子域:在同一级别域名下,myitcast.com(一级域名),可以有多个子域名(www.myitcast.com和gz.myitcast.com),他们之间是搭建在不同的服务器上(不同文件夹:E:/server/apache/htdocs和E:/web),但是可以通过COOKIE设置实现对应的COOKIE共享访问。但是默认是不允许跨域名访问的。

1)设定cookie的有效域名:不同的域名(包含主机)之间不能共享COOKIE
可以通过setcookie的第五个参数来控制
Setcookie(名字,值,生命周期,作用范围,有效域名)
在这里插入图片描述

2)不设定时的默认有效域名
在这里插入图片描述

3)跨子域的设定方法:在设定域名访问的时候用设定上级域名即可:myitcast.com,这个是有所有以myitcast.com结尾的网站都可以共享COOKIE
在这里插入图片描述

COOKIE数组数据
COOKIE本身只支持简单数据(数字或者字符串),能够保留的数据本身有限,也不成体系。如果需要使用COOKIE来保留一组数据的化,想办法凑成数组。(COOKIE不支持数组)
在这里插入图片描述

1)设置形式:setcookie(‘c1[k1]’, 值)
在这里插入图片描述

2)读取形式:$_COOKIE[‘c1’][‘k1’]
在这里插入图片描述

SESSION基本使用

SESSION原理
Session与浏览器无关,但是与Cookie有关。
1、PHP碰到session_start()时开启session会话,会自动检测sessionID
a)如果Cookie中存在,使用现成的
b)如果Cookie中不存在,创建一个sessionID,并通过响应头以Cookie形式保存到浏览器上
2、初始化超全局变量SESSION为一个空数组3、PHP通过sessionID去指定位置(session文件存储位置)匹配对应的文件a)不存在该文件:创建一个sessionID命名文件b)存在该文件:读取文件内容(反序列化),将数据存储到_SESSION为一个空数组 3、PHP通过sessionID去指定位置(session文件存储位置)匹配对应的文件 a)不存在该文件:创建一个sessionID命名文件 b)存在该文件:读取文件内容(反序列化),将数据存储到SESSION3PHPsessionIDsessiona)sessionIDb)_SESSION中
4、脚本执行结束,将$_SESSION中保存的所有数据序列化存储到sessionID对应的文件中
在这里插入图片描述

SESSION基本使用
启用session,任何时候都需要开启session(脚本使用到$_SESSION就开启一次)

$_SESSION是通过session_start()函数的调用才会定义的,没有直接定义
在这里插入图片描述

Session使用需要开启session_start
在这里插入图片描述

设置SESSION信息
如果想存储数据到session中,那么只要不断给$_SESSION数组添加元素即可
在这里插入图片描述

读取SESSION信息
$_SESSION就是一个数组,存储什么数据,什么方式存的,就是可以通过什么方式访问什么数据

在这里插入图片描述

会话技术的本质是为了实现跨脚本共享数据:在一个脚本中定义数据,在另外一个脚本中保存数据
在这里插入图片描述

SESSION基本使用
删除session就是将session数据清理掉(SESSION拿不到)删除一个SESSION信息Unset(_SESSION拿不到) 删除一个SESSION信息 Unset(SESSIONSESSIONUnset(_SESSION[元素下标])删除指定session数据
在这里插入图片描述

删除全部SESSION信息
删除全部数据就是让$_SESSION变成一个空数组
在这里插入图片描述

SESSION基本使用
SESSION相关配置
SESSION基础配置
1)session.name:session名字,保存到COOKIE中sessionID对应的名字
在这里插入图片描述

2)session.auto_start:是否自动开启session(无需手动session_start()),默认是关闭的
在这里插入图片描述

3)session.save_handler:session数据的保存方式,默认是文件形式
在这里插入图片描述

4)session.save_path:session文件默认存储的位置
在这里插入图片描述

使用系统的文件夹存储不安全,需要指定对应存储路径
在这里插入图片描述

SESSION常用配置
1)session.cookie_lifetime:PHPsessionID在浏览器端对应COOKIE的生命周期,默认是会话结束
在这里插入图片描述

2)session.cookie_path:sessionID在浏览器存储之后允许服务器访问的路径(COOKIE有作用范围)
在这里插入图片描述

3)session.cookie_domain:COOKIE允许访问的子域(COOKIE可以跨子域)
在这里插入图片描述

配置的两种形式
1)php.ini中配置:全局配置,修改php.ini中的配置项
在这里插入图片描述

2)脚本中配置:PHP可以通过ini_set函数来在运行中设定某些配置项(只会对当前运行的脚本有效),把这种配置称之为项目级
@Ini_set(‘session.save_path’,’E:/server/sessions’);

SESSION基本使用
Session删除是指删除session数据,$_SESSION中看不到而已;销毁session是指删除session对应的session文件。
销毁SESSION
系统提供一个函数:session_destroy(),会自动根据session_start得到的sessionID去找到指定的session文件,并把其删除。
在这里插入图片描述

SESSION基本使用
SESSION垃圾回收机制
垃圾回收机制原理
session会话技术后,session文件并不会自动清除,如果每天有大量session文件产生但是又都是失效的,会增加服务器的压力和影响session效率。
垃圾回收,是指session机制提供了一种解决垃圾session文件的方式:给session文件指定周期,通过session文件最后更改时间与生命周期进行结合判定,如果已经过期则删除对应的session文件,如果没有过期则保留。这样就可以及时清理无效的僵尸文件,从而提升空间利用率和session工作效率。

1、任何一次session开启(session_start),session都会尝试去读取session文件
2、读取session文件后,有可能触发垃圾回收机制(在session系统中也是一个函数:自己有一定几率调用)
3、垃圾回收机制会自动读取所有session文件的最后编辑时间,然后加上生命周期(配置文件)与当前时间进行比较(所有session文件)
a)过期:删除
b)有效:保留
垃圾回收参数设置
1)session.gc_maxlifetime = 1440:规定的session文件最大的生命周期是1440秒,24分钟
2)session.gc_probability = 1:垃圾回收概率因子(分子)
3)session.gc_divisor = 1000:垃圾回收概率分母

默认的触发概率是1/1000

在这里插入图片描述

测试垃圾回收效果:
1、 修改生命周期为2分钟,120秒
2、 修改触发几率:100%
在这里插入图片描述

SESSION基本使用
禁用COOKIE后如何使用SESSION
禁用COOKIE不能使用SESSION原因
Session技术需要利用到COOKIE技术来保存sessionID,从而使得PHP能够在跨脚本的时候得到相同的sessionID,从而访问同一个session文件。
在这里插入图片描述

解决思路:最终让session_start在开启之前拿到原来的sessionID(另外一个脚本的)
实现无COOKIE使用SESSION
在PHP中,想要解决没有COOKIE也实现session技术的方式有两种:

方案1:可以利用PHP提供的session函数:session_id和session_name来获得和设置sessionID或者name从而解决session_start产生新sessionID的情况(手动操作):
1、 在session保存数据的脚本中获取sessionID和名字
在这里插入图片描述

2、 想办法将数据传递给另外一个脚本:表单传值(URL或者form表单)
在这里插入图片描述

3、 在需要使用到session的脚本中,先接收数据
在这里插入图片描述

4、 组织session_start产生新的ID,告诉它已经存在:session_id($id)
在这里插入图片描述

方案2:可以利用session集中已经提供的解决方案自动操作(配置)
原因1:默认session配置只允许使用COOKIE保存sessionID:cookie_ony
原因2:默认关闭了其他能够传送数据的方式,只保留了COOKIE

1、 修改PHP配置文件,开启其他方式传输sessionID,关闭只允许使用COOKIE传输功能
在这里插入图片描述
在这里插入图片描述

2、 一旦配置开启,PHP会自动将sessionID和session名字在其他位置绑定数据,同时还会在session_start的时候,考虑其他方式传递(表单)的数据,而不是只有COOKIE

在这里插入图片描述

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

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

相关文章

python三级菜单设计题目_Python三级菜单

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 三级菜单:打印省、市、县三级菜单。 可返回上一级,可随时退出程序首先准备基础数据zone{山东:{青…

c#复习-2

输入三个学生的信息学号、姓名、分数从大到小排序 1 using System;2 using System.Collections;3 using System.Collections.Generic;4 using System.Linq;5 using System.Text;6 7 namespace 复习CS8 {9 class Program 10 { 11 struct Student 12 { 1…

long类型python_Python类型long vs C'long long'

I would like to represent a value as a 64bit signed long, such that values larger than (2**63)-1 are represented as negative, however Python long has infinite precision. Is there a quick way for me to achieve this? 解决方案>>> from ctypes import …

Vue中富文本编辑器的使用

基于 Vue 的富文本编辑器有很多,例如官方就收录推荐了一些: https://github.com/vuejs/awesome-vue#rich-text-editing 。 这里我们以 element-tiptap 为例。 GitHub 仓库:https://github.com/Leecason/element-tiptap 在线示例&#xff1a…

Vue项目中使用Echarts(一)

Echarts官方文档 1. 安装Echarts 在cmd命令行输入: npm install echarts --save 2. 代码中使用 注意:import 引入echarts 包时,不要使用 import echarts from ‘echarts’ 而要使用import * as echarts from echarts 否则会报错如下: 3. 页…

Google Guava缓存实现接口的限流

一.项目背景 最近项目中需要进行接口保护,防止高并发的情况把系统搞崩,因此需要对一个查询接口进行限流,主要的目的就是限制单位时间内请求此查询的次数,例如1000次,来保护接口。 参考了 开涛的博客聊聊高并发系统限流…

javaweb 常用jar包_使用javaweb写一个登录案例

下载地址:https://gitee.com/dl_shrimp/java_web_login_case.githttps://www.zhihu.com/video/1241780888599699456讲一下如何使用javaweb写一个登录案例Dao就是用来操作数据库的一些类的统称(1)DAO是Data Access Object数据访问接口。数据访…

Vue项目中使用图片裁切器 cropperjs (头像裁切)

cropperjs官方文档 cropperjs结合element-ui 组件后的显示效果: 1. npm 安装 cropperjs cmd命令行输入:npm install cropperjs --save 2. 导入相关js和css文件 import cropperjs/dist/cropper.css import Cropper from cropperjs3. 用块元素(容器&…

跳一跳python源码下载_python 微信跳一跳和源码解读

刚好周末,想研究一下前阵子很火的微信跳一跳 下面进入正文。 本文适用对象为WIN10系统,安卓用户。目的在于让丝毫没有接触过Python的小伙伴都能成功运行,如果你恰好是这样的对象,那么跟着我开始操作。我会把我自己的每一步都写下来…

HTML文件上传对象file

window.URL.createObjectURL(fileObj)

Vue项目中使用Echarts(二)

1. 安装&#xff1a; 通过 npm 获取 echarts&#xff0c;npm install echarts --save 2. 最终页面展示效果如下&#xff1a; 三、代码实现 map-demo.vue: <template><!-- 1. 为 ECharts 准备一个具备大小&#xff08;宽高&#xff09;的 DOM --><div ref&quo…

Vue项目中使用百度地图API

百度地图官方文档 1. 申请百度账号和ak 申请 2. 引用百度地图API文件 <script type"text/javascript" src"https://api.map.baidu.com/api?v1.0&&typewebgl&ak您的密钥">3. 设置容器样式 设置容器样式大小 4. 创建地图容器元素 …

8.0/9.0 Email 设置

Email 设置一直都是Odoo的一个坑&#xff0c;巨坑。 先讲结论&#xff0c;发邮件可以用&#xff0c;收还是算了吧 1. 发邮件设置 发的设置相对简单&#xff0c;如果企业邮箱支持catcll all功能&#xff0c;基本不用改动可以直接用&#xff0c;否则需要安装第三方模块&#xff0…

Vue v-model 指令详解以及sync修饰符的使用场景(结合父子组件通信案例)

参考Vue官方文档 一、需求如下&#xff1a; 二、代码如下 三、分步解析&#xff1a; 父组件给子组件传值&#xff1a; 子组件给父组件传值&#xff1a; 四、sync修饰符的使用 vue.js官方文档 如果已经使用了v-model双向绑定了一个数据&#xff0c;但是还想要实现另一个数…

stm32F1使用SD卡实现IAP

最近在做一个项目&#xff0c;想使用uSD卡来实现在应用编程&#xff0c;首先需要一些知识 我所使用的单片机是STM32F103ZE&#xff0c;内部flash&#xff0c;超始地址为0x8000000&#xff0c;大小为0x80000&#xff08;0x80000/1024也就是512kByte&#xff09;要实现IAP&#x…

父组件访问子组件中的数据(父子组件通信案例:父组件访问子组件$refs[‘子组件‘],子组件传递数据给父组件(父组件中使用v-model))

一、需求 二、在父组件upload-cover中&#xff1a; 通过$refs[子组件的ref属性值]就能拿到子组件对象 三、在子组件imgae-list&#xff08;相对于父组件upload-cover来说&#xff0c;image-list组件是子组件&#xff09;中 通过在data中定义一个selected&#xff0c;来保存…

[设计模式]6. C++与职责链模式(chain of rsponsibility pattern)

默默地EEer&#xff0c;原文地址&#xff1a; http://www.cnblogs.com/hebaichuanyeah/p/5625233.html 职责链模式指使多个对象多有机会处理请求&#xff0c;避免请求发送者和接受者的耦合关系。 将这些接受处理的对象连成一条链&#xff0c;并沿着该链处理请求。 一个传说中的…

python删除为空值的列_python如何删除列为空的行

1.摘要 dropna()方法&#xff0c;能够找到DataFrame类型数据的空值&#xff08;缺失值&#xff09;&#xff0c;将空值所在的行/列删除后&#xff0c;将新的DataFrame作为返回值返回。 2.函数详解 函数形式&#xff1a;dropna(axis0, howany, threshNone, subsetNone, inplaceF…

axios请求拦截器、响应拦截器、vue-router路由导航守卫的使用(案例)

axios官方文档 一、请求拦截器 设置headers,给所有请求加上Authorization&#xff1a;token值 二、响应拦截器 直接去访问/article,发现可以进入到article内容管理页面 原因是在vue路由拦截器中&#xff0c;我们是这样来判断用户是否有权限访问除了登录页面之外的其他页面&a…

Vue项目部署,打包发布上线

参考vuecli官方文档 一、构建打包 在发布上线之前&#xff0c;我们需要执行构建打包&#xff0c;将 .less、.vue、.js 等相关资源进行编译打包&#xff0c;转换成浏览器可以直接识别运行的普通 css、js、html。 # yarn run build 或者 yarn build npm run buildVueCLI 会把打…