背景
工作那么久,已经无数次听到关于这个主题的讨论,也司空见惯了。然而从未想过认真的研究一下,昨天被组内的同学问到了,虽然我知道区别,但是觉得还是系统的记录下来比较好一些。至于为什么选择简书来记录,因为实在不想在csdn上写了。其实长久以来我对这个概念也不是非常清晰和明确,因为两者的关系和用途看上去非常的接近,抽时间认真的总结一下吧。
由来
我们知道http协议是无状态的,这也是http协议的目的,当客户端向服务端发送一个请求获取相应的资源,服务端在完成工作后都会关闭该链接,不会留下任何记录,真正的用完即走。
但是在实际web业务中,我们经常需要好几个步骤的操作才能完成一次操作场景,这时候就要保持之前状态和数据了,常见的如购物流程,每个用户都可以点结算按钮,而后台无法区分是哪个用户提交的订单,而http协议并不提供这样的方案,为了解决这类问题,我们引入Cookie和Session机制。
客户端保持状态的是Cookie;服务端保持状态的是Session。
Cookie
Cookie小知识
Cookie的本意是饼干(沾牛奶吃的小饼干),在网络上的含义可以理解为“小信息量”。它是由Netscape(网景)前雇员 Louis J. "Lou" Montulli II于1994年6月发明的,并于1994年10月13日在Mosaic Netscape 0.9 Beta版本中开始首次应用cookie,主要是为了辨别Netscape的访问者之前是否访问过该站点。最初cookie的应用是在用户不知情的情况下默认使用的,为此还在1996年和1997年两次被美国联邦贸易委员会听证会讨论过,如今已经被广泛应用在互联网的任何一个角落。
Cookie的存放
Cookie其实是由服务器生成的,发送到用户的客户端后,由浏览器保存在临时文件夹中,比如IE的cookie文件存放在C:\Users\yourname\AppData\Local\Microsoft\Windows\Temporary Internet Files下。我们清除浏览器缓存通常清除的就是这个目录下的文件。Cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中增加一个键值对来通知浏览器按照内容生成相应的Cookie存放到本地目录中。当然这样生成的Cookie的生命周期是由其创建者来控制的,每次加载页面时,都会把Cookie发回服务端进行验证,是具有时效性的。这个特性可以让服务端非常方便的获取到用户的状态信息,浏览信息等任何网上的行为记录,这就是为什么你在淘宝搜了一次安全套,每次访问其他网站,都能精确的给你推送最新的安全套产品。这也带来了一个安全隐患,即我们耳熟能详的XSS和CSRF攻击。
Cookie的组成
Cookie一般是由key、value、有效期、路径、域构成的。比如打开浏览器的临时目录,你会看到这样的文件:cookie:zhangsan@www.so.com/ 这样的命名。如果不设置有效期,则表明这个cookie的生命周期在关闭浏览器窗口时结束,及会话cookie,这种会话cookie不会保存在硬盘中,而是存储在内存里。本地持久化的cookie支持进程间的共享,比如选择在新窗口打开,可以同时读取到本地持久化的cookie文件。
Session
Session在网络中常见的理解就是“会话控制”。Session让客户端的用户和服务端保持一种联系,服务端可以通过session得到当前用户的状态、属性。当用户访问web站点时,服务端会检查当前访问是否有会话连接,如果没有的话,则会为其创建一个会话,并赋值存储一个唯一的session ID来进行标识,当会话过期、抛弃的时候,服务端会销毁该会话。
session的存放
服务器在创建session会话后,在设定时间后会销毁该对象,比如tomcat默认是30分钟(可以改)。也有一种做法是将session序列化后存储起来,但是当服务器连接达到一定量级后,这种方式会给服务器造成巨大的压力。还有一种做法是在客户端存放session,比较场景的有2种:
1. 存在Cookie中,常见的功能“记住我的登录”一般用这种方法。服务器通过设置Cookie的方式将Session ID发送到浏览器。如果我们不设置这个过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上。
2. 以URL参数的方式传递,也就是像我们经常看到JSP网站会有index.jsp?JSESSIONID=*一样的。这种方式和第一种方式里面不设置Cookie过期时间是一样的。
3. 在form表单中设置一个隐藏域进行存放和传输










网友评论