对Cookie和Session的理解
本篇文章系自己总结经验,如果有朋友感觉哪里有问题,欢迎留言评论,谢谢~!
Cookie和Session的产生背景:
在动态页面里面,每个变量都是有有效期的,所有的变量的最大生命周期就是一个脚本的周期(拿PHP来说,浏览器向服务器发出一次请求,请求到达服务器后,服务器将该请求交由PHP处理,PHP处理完了以后交给服务器,最后服务器响应给浏览器,这就是一个脚本周期,也就是一个变量的最大有效期)。
这时候问题出来了,如果我登录了一个网站,这个网站需要确定我是不是它的用户,第一次请求我成功登录了该网站的首页,然后我开始浏览这个网站上的其他网页,浏览其他网页的时候,这个网站的服务器该怎么确定我是不是已经登录上了该网站呢?
这时候就需要使用一个变量来保存这个标志,而这个标志可以代表我是已经合法登录上来了,所以这个变量的有效周期就需要被延长,那么怎么延长呢?
这个时候会话技术出现了(在同一台浏览器与网站服务器的多次请求之间,将数据持久存储的一种技术),它的前提是B/S请求响应模式,是无状态的(也就是在任意的请求之间,不存在任何的联系,不能将请求状态保持下去。)那么会话机制的实现是用什么来实现的?
答案是1.cookie 2.Session
下面是对cookie的介绍:
百度百科的解释:
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
从上面我们可以知道,Cookie是浏览器端的一种技术。那么我们写程序的时候应该怎么使用Cookie呢?下面是使用Cookie的基本操作(PHP):
设置(增删改):
SetCookie(key, value) :完成Cookie数据的设置(增),key存在则更新(改),不存在则添加。如果值为空字符串,表示删除该key(删)
获取(查):
$_COOKIE['KEY']:PHP在初始化阶段,会将所有的cookie数据整理到此变量中,供PHP脚本使用。
设置Cookie的有效期(第三个参数):
setCookie("key","value",timestamp):第三个参数采用时间戳表示。
特殊的有效期值:0:表示默认的,也就是一个会话周期;
time()-1 :删除Cookie的标准做法,比如:setCookie('key','',time()-1)
PHP_INT_MAX:逻辑上表示永久有效的Cookie,实际上是到了2038年。。。
Cookie的有效期
判定Cookie的有效期的是浏览器,服务器在设置Cookie时,会告诉浏览器该Cookie的有效期。浏览器在发送请求的时候会判断Cookie是否有效,只有没有过有效期的cookie数据才会被携带。
设置Cookie的有效路径(第4个参数):
setCookie("key", "value", "timestamp", /): ‘/’:表示整站有效。也就是同一域名下都有效。
Cookie的有效路径
Cookie在当前路径以及后代路径有效。这里的路径,不是代码文件所在的本地磁盘路径,而是浏览器访问的url路径关系。不同路径下面,同名的Cookie可以同时存在于浏览器中。也就是Cookie中可能会出现两个key一样的。
设置Cookie的有效域(第5个参数):
setCookie("key", "value", timestamp, /, "blog.hengshare.top"):表示在blog.hengshare.top这个二级域名下面都有效。为空表示在当前请求url的域名下面有效。
设置是否仅安全传输(第6个参数):
setCookie("key", "value", timestamp, /, domain, true|false):为true表示仅支持安全传输,false为默认值,表示不管是HTTP还是HTTPS,都可以将有效的Cookie携带至服务器端
设置HTTPonly(第7个参数):
setCookie("key", "value", timestamp, /, domain, true|false, true|false):默认为false,表示浏览器存储的Cookie是可以被其他脚本所处理的。为true时,表示Cookie仅可以在http请求中使用,建议:true
下面是对Session的解释:
同样的,先贴出来百度百科的解释:
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。注意 会话状态仅在支持 cookie 的浏览器中保留。
根据以上解释,我们知道session是一种基于Cookie的一种机制。而与Cookie不同的是,session的会话数据是存放在服务器端的,仅在浏览器端维持一个sessionid,用来标识某个会话对应的服务器端的session数据区,用来配对使用。下面是对session的详细使用(PHP):
开启session:
session_start(); :也可以通过PHP的配置文件设置为自动开启。(php.ini中对应的选项为:session.auto_start)
利用$_SESSION操作session数据:
$_SESSION['KEY']; :(session可以存放任意类型的数据,cookie只能存放字符串数据)
session的会话数据默认存放在服务器端操作系统的临时目录/tmp中。
销毁session:
session_destory(); :删除当前的session对应的数据区,关闭session机制。并不完成session的写操作。
完整删除与当前session相关的全部数据:
session_destory(); //删除数据区
unset($_SESSION); //销毁变量
setCookie(session_name(), '', time()-1); //销毁cookie中的sessionid
清空session数据:
$_SESSION=array(); //不要使用unset($_SESSION)
session 的数据属性:
1.有效期:session.cookie_lifetime
2.有效路径:session.cookie_path
3.有效域:session.cookie_domain
4.是否仅安全传输:session.cookie_secure
5.是否仅http使用:session.cookie_httponly
修改以上的属性有以下几种办法:
1.更改php.ini配置文件(不建议)
2.通过在脚本中使用ini_set()来进行配置修改,仅在设置后的脚本周期内有效,要保证在开启session前设置完毕。
3.使用特定功能函数:session_set_cookie_params(有效期,有效路径,有效域,是否仅安全传输,是否httponly); 注意:也是要在开启session之前设置完毕。
session的一些注意事项:
session可以存放任意类型的数据,因为session数据区里面的数据是经过序列化以后才存储的。
$_SESSION数组的下标,仅仅可以是字符串类型。
session_start()函数类似于header()函数,前面不应该有输出。
在同一脚本内使用session_destory()函数,之后如果对session进行了操作,并不会将修改保存到session数据区,所以在下次脚本周期就不能获取到存储的session数据了。
| Cookie | session | |
| 会话数据存储位置 | 浏览器端 | 服务器端 |
| 安全性 | 低 | 高 |
| 数据传输量 | 大 | 小 |
| 支持会话数量 | 有限制,单个最大4k | 无限制 |
| 支持数据类型 | 字符串 | ALL |
对Cookie和Session的理解的更多相关文章
- 关于cookie与session的理解
服务器端并不能捕获客户端的浏览器关闭事件,因此你关闭浏览器以后,服务器端那个Session还是存在的,要超时以后才被回收,启动一个新的浏览器会启动一个新的session,所以他不认你了session永 ...
- Java Web(三) 会话机制,Cookie和Session详解
很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...
- Java Web(三) 会话机制,Cookie和Session详解(转载)
https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...
- pyhton框架Django之cookie和session
一,cookie和session的理解 cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies.它保存在浏览器下的某个文 ...
- 会话机制,Cookie和Session详解
转载自:https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二 ...
- 理解Cookie和Session机制(转)
目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...
- 转:理解Cookie和Session机制
原文: 理解Cookie和Session机制 摘要: Cookie工作原理 由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论 ...
- cookie&&session再理解笔记
就拿php来说,两个php页面之间不拿get,post传递变量的话,数据是不能共享的.访问完1.php页面该页面的变量就被销毁了.所以就拿学校食堂来说,拿现金买饭的话你交完钱后,他给你个票以便确认你, ...
- 理解Cookie和Session机制
转载: 理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录 ...
随机推荐
- 使用ecstore-sdk开发包制作易开店和启明星模板
前言: 尽管商派官网有模板开发教程,但是诸多方面太过笼统.我等平庸之辈,纵使细心研读,潜心修炼,亦未能品味练功境界,领悟其中真谛. 商派有云,此九阳真经不用您挥刀****本人却感觉此教程令人抓狂,无人 ...
- leetcdoe 175. Combine Two Tables
给定两个表,一个是人,一个是地址,要求查询所有人,可以没有地址. select a.FirstName, a.LastName, b.City, b.State from Person as a le ...
- Course Schedule课程表12(用Topological Sorting)
[抄题]: 现在你总共有 n 门课需要选,记为 0 到 n - 1.一些课程在修之前需要先修另外的一些课程,比如要学习课程 0 你需要先学习课程 1 ,表示为[0,1]给定n门课以及他们的先决条件,判 ...
- phpcms与discuz的ucenter整合
1.安装phpcms系统,域名为pc.me 2.安装discuz,并选择安上uc_server,域名为dz.me 3.在phpcms下phpsso的系统设置 4.到ucenter管理中心- ...
- Spring基于AspectJ的AOP的开发之AOP的相关术语
1. Joinpoint(连接点) -- 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点(任何一个方法都可以称为连接点) 2. Pointc ...
- Golang之waitgroup用法
我敲下一堆代码,终于长出了果实,今天是个伟大日子 package main import ( "fmt" "sync" "time" ) / ...
- 201621123008 《Java程序设计》第二周学习总结
1. 本周学习总结 通过查询API掌握了一下几种类的基本用法: String类 StringBuilder类 ArrayList类 BigInteger类 BigDecimal类 Arrays类 认知 ...
- 关闭文件流--fclose,
头文件:#include<stdio.h> 函数原型:int fclose(FILE *fp) 参数说明:fp将被关闭的文件指针 返回值:成功返回0,失败返回EOF宏.
- 【Java】Eclipse在线安装SVN插件
安装环境 系统:win7系统 软件:eclipse(Mars.2 Release (4.5.2)) 安装步骤 1. 打开eclipse软件,点击菜单栏的help——>Install New So ...
- 2018.07.26NOIP模拟 魔法数字(数位dp)
魔法数字 题目背景 ASDFZ-NOIP2016模拟 题目描述 在数论领域中,人们研究的基础莫过于数字的整除关系.一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 ...