Cookie与Session简介
Cookie与Session简介
本章介绍重点:
本章重点为大家介绍在Web开发过程当中经常会使用到的Cookie与Session的概念,它们的使用方法和应用场景,以及它们的优点与局限等等。深刻理解与掌握它们的用法,可以更好的帮助我们开发出正确可用的产品。
我们为什么需要Cookie与Session:
在开始本章程的介绍之前,我们有必要要问自己一个问题,我们为什么需要Cookie与Session?它们可以帮助我们解决什么问题?
让我们先来了解了解我们经常使用的HTTP协议是什么:HTTP是一个属于应用层的面相对象的应用协议,它具有以下五个特点:
- 支持客户端<->服务器服务
- 简单快速
- 灵活
- 无连接
- 无状态
如何理解HTTP的无状态特性?用当下流行的一句话来描述就是“人生若只如初见”。HTTP协议处理事务请求没有记忆能力,对同一个URL的请求没有上下文的关系,你所发出的每一次HTTP请求都是独立的,它的执行情况与响应的结果不会受到之前的HTTP请求的影响,当然它也不会干扰影响后续的HTTP请求与响应,处理HTTP请求的服务器没有保存客户端的状态。
可以设想一下,假如基于这些特性而不做任何的特殊处理与改进,我们访问网络站点时会是怎样的体验?拿网购来说吧。当我们访问某电子商城的时候,提示需要输入用户名以及密码,我们按要求填写所需信息成功登陆,琳琅满目的商品展示在我们的眼前,我看上了一款最新的电子产品,打算点进去看看详细介绍,可接下的情况却让我们大跌眼镜,由于服务器没有我们的登陆状态,网站竟要求我重新输入用户名跟密码?这将会是一个多么糟糕的用户体验。
很明显,HTTP的这种无状态的特性严重的阻碍了我们与服务器的交互,于是两种用于保持HTTP连接状态的技术就应用而生了:Cookie与Session,这也是我们本章的介绍重点。
Cookie:
Cookie是什么?
翻阅维基百科以及百度百科,我们不难发现,Cookie 是在 HTTP 协议下,服务器或脚本用以维护客户工作站信息的一种方式。它是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,可以用于记录用户的活动或者是与记录与状态相关的信息。Cookie是由W3C组织提出,最早由NetScape公司开发实现,现已经成为了一种标准,主流浏览器都支持Cookie机制。
Cookie的工作机制可以参见下面的图示:
正如前面所说,Cookie保存在客户端电脑,不同的浏览器,存放的路径可能有所不同,如下列举几个常见主流浏览器的存放位置:
- IE存放位置:C:\Users\{$UserName}\AppData\Roaming\Microsoft\Windows\Cookies\xxx.txt
- FireFox存放位置:C:\Users\{$UserName}\AppData\Roaming\Mozilla\Firefox\Profiles\{$xxx.default}\cookies.sqlite
- Chrome存放位置:C:\Users\{$UserName}\AppData\Local\Google\Chrome\User Data\Default\Cookies
注意:IE浏览器中,IE将各个站点的Cookie分别保存为一个txt纯文本文件;而Firefox和Chrome是将所有的Cookie都保存在一个文件中,该文件的格式为SQLite3数据库格式的文件。
Cookie的属性:
Cookie的常用属性可以参阅下列表格:
Cookie的Server Side操作:
创建一个新的Cookie,我们可以通过以下的代码来实现:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie myCookie = new Cookie("username", "WebOpenShare");myCookie.setMaxAge(300);myCookie.setDomain("www.webopenshare.com");myCookie.setPath("/");myCookie.setSecure(false);response.addCookie(myCookie);
}
运行上述的代码,我们便可以得到一个名为"username",其对应的值为"WepOpenShare"。(如果你是本地运行Tomcat服务器,请记得修改你电脑hosts文件)
Cookie对象没有提供直接修改其属性的方法,要修改原有Cookie的值,我们只能够通过创建同名的Cookie并添加到response中覆盖掉原Cookie的设置,如下所示:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// ...Cookie myModifiedCookie = new Cookie("username", "MyWebOpenShare");myModifiedCookie.setMaxAge(600);myModifiedCookie.setDomain("www.webopenshare.com");myModifiedCookie.setPath("/");myModifiedCookie.setSecure(false);response.addCookie(myModifiedCookie);
}
同样的,Cookie对象也没有提供直接删除某一个Cookie的操作方法,想要删除某一个Cookie,我们只能够通过新建一个maxAge为0的同名Cookie,把它添加到response中删除原先的Cookie,具体如下代码所示:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// ...Cookie deleted = new Cookie("username", "MyWebOpenShare");deleted.setMaxAge(0);deleted.setDomain("www.webopenshare.com");deleted.setPath("/");deleted.setSecure(false);response.addCookie(deleted);
}
注意:修改跟删除某一个Cookie时,我们要通过创建一个同名Cookie来进行覆盖,对于这一个同名Cookie,除了它的value跟maxAge属性可以不同,其余的所有属性必须跟要修改的Cookie保持一致,否则将会操作失败。
Cookie的Client Side操作:
我们知道Cookie是保存在客户端的,那么我们可不可以通过一些脚本语言,例如JavaScript在浏览器中操作Cookie呢?如果有,我们可不可以像在Server Side操作Cookie一样,对Cookie进行读写/修改甚至是删除的操作呢?
可以肯定的是,我们可以通过脚本在浏览器中操作Cookie,但是出于安全性的考虑,它所允许的操作非常有限,仅限于读取当前域名下的Cookie,不可以修改或者删除Cookie。通过下面的代码我们就可以读取出当前Domain下的Cookies.
<script>document.write(document.cookie);</script>
Cookie应该存放什么值:
前面的介绍当中,我们提及Cookie存放在客户端的文件上,如果客户端被入侵,那么这些Cookie文件存在被盗的潜在危险;另一方面,我们都知道,HTTP协议采用的是明文传输的方式,如果有人监听或者是截取了我们的请求,那么我们通过Cookie传送给服务器的信息就就全部曝露在入侵者面前。因此,存放在Cookie里面的值应当尽量避免个人敏感信息,如果非要存放敏感关键信息的时候,也要先经过加密处理之后再存放。
Session:
Session是什么?
Session是另外一种用户保持HTTP连接状态的解决方案,与Cookie不同,Session存放于服务器内存当中,服务器采用了一种类似于散列表(Hashtable)的形式来存放Session对象信息。
Session保存在服务器上,所以它会消耗服务器的资源,因此,我们不应该在Session里面存放太多太过复杂厚重的对象跟信息,在高并发的情况之下,这样做很容易会使得服务器内存溢出使得程序异常或者最终宕机。
Session的机制:
Session的机制,可以参见下图:
Session何时创建?
Session何时被创建呢?是不是我们访问服务器就会创建一个Session呢?答案是否定的,只有我们在程序中调用到Session的时候,服务器才会帮我们创建Session对象。例如在Servlet当中,当我们调用request.getSession()的方法时,服务器就会创建一个Session对象。但是细心的朋友可能会发现,当我访问某一个JSP页面的时候,也会有Session对象生成,此时我并没有在Servlet或者是JSP当中显式的使用任何的request.getSession()方法。这里我特别强调的是显式这个词语,其实当我们访问JSP的时候,JSP编译成Servlet的时候默认会帮我们添加这样的代码:HttpSession session = request.getSession(),这也是为什么我们可以什么都不做,就直接在JSP页面当中使用session.getAttribute()或者是其它的操作。
Session何时销毁?
前面谈了Session的创建,接下来我们来看看Session何时被销毁?当然,关闭服务器可以保证所有的Session被销毁。那关闭浏览器呢?很多人有一个误解,觉得只要我关闭了浏览器,Session就销毁了。其实这种理解是不全面的,我们知道,Session是由服务器创建并维护的,因此销毁与否须由服务器来完成,单纯关闭端浏览器并不会触发销毁内存的动作,如果我们重新打开浏览器,并向服务器发送之前的Session ID,是可以找回之前的Session的。只有在关闭浏览器的同时触发一条服务器请求,告诉服务器销毁掉内存,那才可以做到这样的效果。
恰恰是由于关闭浏览器并不能销毁内存,出于安全性的考量,我们需要为Session来设置一个有效期,当一次访问距离上次的请求超过这个有效期的话,那之前的Session就会销毁失效。
Cookie被禁用时?
Session的工作机制,默认情况下是需要浏览器的Cookie来配合工作的。当服务器创建一个全新的Session之后,会向浏览器发送一个Session ID的信息,通常是以Cookie的形式返回给客户端,在接下来的请求中,客户端便会自动在请求当中携带上这个Session ID的参数,服务器根据传递上来的Session ID直接从服务器中查找返回之前的Session对象。但是如果客户端禁用Cookie呢?
由于Cookie可以被人为的禁止,必须有其它机制以便在Cookie被禁止时仍然能够把Session ID传递回服务器。经常被使用的一种技术叫做URL重写,就是把Session ID直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://${domain}:${port}/${uri};SESSIONID=xxxxxxxxxxx;另一种是作为查询字符串附加在URL后面,表现形式为http://${domain}:${port}/${uri}?SESSIONID=xxxxxxxxxxx。
Session常用方法:
Session的常用方法总结如下表所示:
抛出引子:
部署在同一服务器上的所有应用之间是不是共享同一个Session?请关注我们,在后续章节跨应用Session共享中我们会为您揭秘。
我要小额赞助,鼓励作者写出更好的文章:
转载于:https://www.cnblogs.com/websharing/p/8487472.html
Cookie与Session简介相关推荐
- Cookie和Session简介与区别
1.Cookie和Session简介与区别 在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用Cookie与 ...
- Cookie与 Session使用详解
1.Cookie和Session简介与区别 在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用Cookie与 ...
- (进阶篇)Cookie与 Session使用详解
1.Cookie和Session简介与区别 在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用Cookie与 ...
- Day 63 django 中间件、cookie、session
Day 63 django 中间件.cookie.session 文章目录 Day 63 django 中间件.cookie.session 1.cookie与session 简介 2.django操 ...
- cookie、Session、Token、sessionStorage、localStorage简介__Token放在 cookie, sessionStorage 和 localStorage中区别
cookie.Session.Token.sessionStorage.localStorage简介 cookie 是一个非常具体的东西,只得是浏览器里永久存储的一种数据,是浏览器实现的一种数据存储功 ...
- 32:第三章:开发通行证服务:15:浏览器存储介质,简介;(cookie,Session Storage,Local Storage)
说明: (1)简单介绍浏览器存储介质:cookie,Session Storage,Local Storage: (2)目前为止的.可以确定的几点: ● 这些存储介质都是浏览器的,我们要想使用这些存储 ...
- cookie和session、web服务工作原理、Apache配置php扩展、php简介
cookie和session: cookie和session区别:cookie数据是存在本地的,而session数据是存在服务端的,session比cookie更安全. cookie:用于http做会 ...
- 网络:.cookie和session原理及区别
一.Cookie详解 (1)简介 因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现.在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料 ...
- Cookie和Session的作用和工作原理
一.Cookie详解 (1)简介 因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现.在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料 ...
- [html] 说说你对cookie和session的理解
[html] 说说你对cookie和session的理解 cookie: 可以通过客户端, 服务端设置, 容量小, 可以通过设置domain来实现同步登录, 除了name, value, 它还有多个选 ...
最新文章
- mysql约束日期_MySQL的约束、事务、字符串、日期、数学相关及其他补充
- 过去可忆,未来可期(随心录+杂记)
- python 魔法函数 __add___PythonI/O进阶学习笔记_2.魔法函数
- c++ map 修改value_C++知识分享之STL容器:set 容器与 map 容器的简单应用
- 【NOIP2012-开车旅行】
- Power Network POJ - 1459(EK算法模板+详解)
- access订单明细表怎么做_图书销售订单明细表 (4)
- 前端页面加载速度优化---Ngnix之GZIP压缩
- 访问kubernetes dashboard UI报错
- 不知不觉 CDSN 也有了百万访问量了
- 卡巴斯基变相提供一年免费服务
- python numpy log_工具amp;方法 | 6行代码教你用Python做OLS回归(内附CFPS实例)
- itext实现横向pdf打印
- 【10.28 校内普及组】 小B浇花 题解
- ChatGPT在线网页版和接口
- 首创Domino前后端彻底分离,结合vue、react优美例子
- iptables知识点总结
- 【Java】多线程(以java webcam实现视频功能为例)
- Surround360 Render目录下CALIBRATION文档——中文翻译
- C语言实现雷达RD成像算法,RD成像算法分析