本篇文章系自己总结经验,如果有朋友感觉哪里有问题,欢迎留言评论,谢谢~!

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数据了。

session和Cookie比较
  Cookie session
会话数据存储位置 浏览器端 服务器端
安全性
数据传输量
支持会话数量 有限制,单个最大4k 无限制
支持数据类型 字符串 ALL

对Cookie和Session的理解的更多相关文章

  1. 关于cookie与session的理解

    服务器端并不能捕获客户端的浏览器关闭事件,因此你关闭浏览器以后,服务器端那个Session还是存在的,要超时以后才被回收,启动一个新的浏览器会启动一个新的session,所以他不认你了session永 ...

  2. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  3. Java Web(三) 会话机制,Cookie和Session详解(转载)

    https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...

  4. pyhton框架Django之cookie和session

    一,cookie和session的理解 cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies.它保存在浏览器下的某个文 ...

  5. 会话机制,Cookie和Session详解

    转载自:https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二 ...

  6. 理解Cookie和Session机制(转)

    目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...

  7. 转:理解Cookie和Session机制

    原文: 理解Cookie和Session机制 摘要: Cookie工作原理 由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论 ...

  8. cookie&&session再理解笔记

    就拿php来说,两个php页面之间不拿get,post传递变量的话,数据是不能共享的.访问完1.php页面该页面的变量就被销毁了.所以就拿学校食堂来说,拿现金买饭的话你交完钱后,他给你个票以便确认你, ...

  9. 理解Cookie和Session机制

    转载: 理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录 ...

随机推荐

  1. XX-net 部署网络

    https://github.com/XX-net/XX-Net/wiki/%E4%BD%BF%E7%94%A8Chrome%E6%B5%8F%E8%A7%88%E5%99%A8 主要步骤有三步:安装 ...

  2. jquery 赋值时不触发change事件解决

    $("#optionsId").change(function(){ $("#selectOptionsText").val('测试'); }); $(&quo ...

  3. 过滤输入htmlentities与htmlspecialchars用法

    过滤输入 (即来自所列数据源中的任何数据)是指,转义或删除不安全的字符.在数据到达应用的存储层之前,一定要过滤输入数据.这是第一道防线.假如网站的评论表单接收html,默认情况下 访客可以毫无阻拦地在 ...

  4. shell中数组基础语法

    数组的基本赋值 arr=(a b c) arr[index]=a 2.常用的两个方法 str=${arr[@]}(数组转化成字符串) len=${#arr[*]}(数组长度) 3.遍历数组的方法 #! ...

  5. 在控制台远程连接mysql数据库时,出现ERROR 2049 (HY000)错误

    问题的原因是,你本地的数据库版本过高,而远程的数据库版本低. 解决方法:在连接时加上  --skip-secure-auth 参数就可以了. mysql -h主机 -u用户名 -p密码 --skip- ...

  6. PAT 1058 选择题(20)(代码+思路)

    1058 选择题(20 分) 批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多. 输入格式: 输入在第一行给出两个正整数 N(≤ 1000)和 M(≤ 100 ...

  7. svn回退版本/取消修改

    取消对代码的修改分为两种情况:   第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [ ...

  8. js replace 用法

    /g  表示全部 global 在很多项目中,我们经常需要使用JS,在页面前面对前台的某些元素做做修改,js 的replace()方法就必不可少. 经常使用"ABCABCabc". ...

  9. const stirng* 类型的指针cp,当cout<<*cp<<endl:会提示没有与之匹配的“<<”运算符

    #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> usin ...

  10. hdu-1207(规律推导)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207 思路: 可以按照类似汉诺塔的推导形式来推导, 首先,有四个柱子,a,b,c,d. (1)a的x个 ...