理解Session与Cookie
写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益。
=====正文开始========
在web的世界里,客户端通过HTTP Request向服务器发送请求,服务器通过HTTP Response响应用户请求,可是由于HTTP协议是无状态的,导致客户端和服务器端每次就像喝了孟婆汤一样,彼此相忘,导致每一次客户端的HTTP Request,服务器端都会认为是一次新的请求。对于一些简单的业务逻辑,彼此相忘,互不记得,没什么大碍,可是有的时候,就需要服务器端记住客户端,保持客户端访问的连续状态,以便实现所需的业务逻辑,方便服务器端程序编写。(例如一个用户登陆进去购物网站,那么就需要服务器端记住该用户的状态,不至于方法每一页面都需要用户登陆),于是就出现了Cookie和Session用来解决这种问题。
1.Cookie
(1)当客户端第一次访问服务器,向服务器端发送HTTP Request,服务器端返回HTTP Response,在HTTP Response的Header中通过Set-Cookie来设置Cookie,以便在客户端保存信息,例如Set-Cookie的设置如下:
名称:UserName 内容:Nicaiwoshishui 域: cnblogs.com 脚本可访问: 是 创建时间: 2015年2月16日星期一下午3:: 过期时间: 2015年8月17日星期一下午3::
(2)客户端(如浏览器)在收到服务器端HTTP Response后,看到了Set-Cookie的设置,那么就会在客户端电脑浏览器相应的目录生成该Cookie文件。对于IE浏览器来说,每一个域名的Cookie的内容保存成一个文件名为XXX.txt的文件,对于Chrome浏览器来说,所有的Cookie内容都写入一个文件;不过这不是关键,我们只需知道浏览器将Cookie内容保存下来了。
(3)当客户端第二次访问服务器时,向服务器发送HTTP Request,在HTTP Request的Header中,会包含上面的Cookie信息,这样在服务器端收到HTTP Request后,就知道是谁在访问了。
(4)以后的每次向服务器的HTTP Request,Header中都会包含该Cookie信息,直到过期时间到了为止。
(5)Cookie的存在大大方便了我们的操作,我们可以存入任意我们需要的信息,但是Cookie的内容会随着HTTP Request在header中传送,不宜过大。往往浏览器都会限制Cookie的大小和数目,同时也可以对Cookie内容进行压缩再进行传送。
2.Session
Cookie的内容是保存在客户端,我们也可以把数据保存在服务器端,这就是Session。Session有会话的意思,需要与Cookie的配合才能起作用。
(1)当客户端第一次访问服务器,向服务器端发送HTTP Request,服务器收到HTTP Request,如果在服务器端代码中启动Session设置,那么会生成一个唯一的SessionID,例如SessionID为:hu3g8fckjbk584qp2jn941vho5,之后服务器端会为以该SessionID为名生成Session文件,保存在服务器文件中,例如在服务器端生成文件名为sess_hu3g8fckjbk584qp2jn941vho5的文件;有时也会保存在内存中,生成与SessID相对应的对象;有时也可以保存在数据库中;无论保存在哪里,可以说生成了一个唯一SessionID的Session,之后我们就可以设置Session的内容了,例如Session['UserName']='nicaiwoshishui'。
(2)服务器端通过唯一的SessionID保存了用户的信息,在返回的HTTP Response中,仍然会有Set-Cookie的设置,不过现在不再需要把用户名保存在Cookie中,而是将SessionID保存在Cookie中,同样也会设置Cookie的过期时间等等信息,由于该Cookie保存的是SessionID的信息,因此也称为SessionCookie。有时我们启动Session后,并不需要我们手动的设置Cookie,web server会自动帮我们在HTTP Response的header中增加Set-Cookie的设置。
(3)当客户第二次访问服务器,发送的HTTP Request的Header中会含有该Cookie信息,服务器端收到Cookie信息后就能从中找到SessionID,进而可以找到服务器端内保存的该SessionID的Session了,无论是从内存中、文件中、数据库中,甚至是分布式环境中。
(4)Session可以设置有效期,如果在有效期内,一直没有客户端访问,那么到有效期过后,用户访问服务器后,需要重新设置Session;对于需要登录的网站,会提示会话过期,请重新登录。
(5)SessionCookie也有有效期,一般默认的是关闭浏览器后就过期,因此关闭浏览器后如果在访问之前登录的网站,会提示会话过期,请重新登录。这里注意,虽然关闭浏览器后,客户端的SessionCookie就被删除了,但是如果服务器端的Session还没有过期,那么服务器端的Session信息仍然会被保留;由于SessionCookie被删除了,无法在HTTP Request的Header中传送SessionID,因此也就无法再识别该用户了。
(6)如果使用浏览器A访问服务器端,服务器端设置的SessionID为SessionID1,使用浏览器B访问服务器端,服务器设置的SessionID为SessionID2,那么SessionID1与SessionID2不同,其中使用浏览器A的用户设置的所有Session值,如Session['userName']值会保存在SessionID1中,而使用浏览器B的用户设置的所有Session值,保存在SessionID2中,两者互相不干扰。
(7)Session需要与SessionCookie配合才能够很好工作,如果客户端禁用Cookie后,那么Session机制就会失效,具体体现就是用户在浏览器中访问很多网站访问不了。
(8)为了使禁用Cookie的用户能够正常访问服务器端网站,可以通过一种URL Rewriting的方法,解决Session机制失效的问题。
理解了Session和Cookie的基本概念,对于解决一些更复杂的问题,也会变得比较容易。
(完)
文档信息
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
- 本文为原创文章,欢迎转载,后续本博客会不断更新,因此请保留该文档信息。
- 本文地址:http://www.cnblogs.com/wuguanglei/p/4294251.html
理解Session与Cookie的更多相关文章
- 转!!深入理解 Session 与 Cookie
摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...
- 深入理解Session与Cookie(一)
Session,Cookie简介: Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷: Cookie: 随着Cookie的个数的增多和访问量的增加,它占用的网 ...
- 深入理解 Session 与 Cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
- 【转】深入理解 Session 与 Cookie
Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简单又复 ...
- [web]深入理解Session和Cookie
一.理解Cookie 由于http是一种无状态的协议,当用户的一次访问结束后,后端的服务器就无法知道下一次来访问的请求是不是上一次的用户了.那么Cookie的作用就是用户通过http访问一个服务器时, ...
- 理解session和cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
- 第10章 深入理解Session与Cookie
需要很多Cookie时,考虑HTTP对Cookie数量和大小的限制. 几百或更多台服务器的时候,如何解决Session在多态服务器之间共享的问题. 还有一些安全问题,如Cookie被盗,Cookie伪 ...
- 深入理解Session和Cookie机制
具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而 ...
- 第十章 深入理解Session与Cookie
理解Cookie 理解Session Cookie安全问题 分布式Session框架 Cookie压缩 表单重复提交问题 多终端Session统一
随机推荐
- 关于DOM的操作以及性能优化问题-重绘重排
写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...
- 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)
上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...
- .NET Core RC2/RTM 明确了时间表
.NET Core 经过了将近2年的开发,去年12月份发布的RC1版本,明确来说那只是一个beta版本,自从RC1发布以来,看到github里的RC2分支,整个工具链都发生了很大的变化,大家都在焦急的 ...
- CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15
之前有位搞平面的好友“小瘦”说CDR X8无法破解,只能用X7.呃……呃……呃……好像是的 其实CDR8难激活主要在于一个点“没有离线激活了,只可以在线激活”,逆天不是专供逆向的,当然没能力去破解,这 ...
- JQuery 复制粘贴上传图片插件(textarea 和 tinyMCE)
开源地址:https://github.com/yuezhongxin/paste-upload-image.js 支持 Ctrl+C/Ctrl+V 上传,支持拖拽上传,也支持 QQ/微信截图上传. ...
- JS实现页面进入、返回定位到具体位置
最为一个刚入职不久的小白...慢慢磨练吧... JS实现页面返回定位到具体位置 其实浏览器也自带了返回的功能,也就是说,自带了返回定位的功能.正常的跳转,返回确实可以定位,但是有些特殊场景就不适用了. ...
- 一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息.由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量. 在.NET项目中如果用户提出了相关文 ...
- [原] KVM 虚拟化原理探究 —— 目录
KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...
- go语言:多个[]byte数组合并成一个[]byte
场景:在开发中,要将多个[]byte数组合并成一个[]byte,初步实现思路如下: 1.获取多个[]byte长度 2.构造一个二维码数组 3.循环将[]byte拷贝到二维数组中 package gst ...
- C++ 事件驱动型银行排队模拟
最近重拾之前半途而废的C++,恰好看到了<C++ 实现银行排队服务模拟>,但是没有实验楼的会员,看不到具体的实现,正好用来作为练习. 模拟的是银行的排队叫号系统,所有顾客以先来后到的顺序在 ...