Work Better Than Yesterday!

zhangge's stupid and messy life


Home| Life| Technique Concentrate On One Thing.

关于Cookie和Session

11 Jun 2013

在学javaee的时候就学过这两个东西,但是当时什么基础都没有,学了就学了,只是简单地记住而已,并非真正理解了这个东西,现在有了操作系统,网络等基础知识以后,再次学习!

1. 什么是Cookie

Cookie的意思是小饼干,估计取的是它一小块的意思吧!本质上,它就是一个键值对key-value字符串而已。Cookie保存在客户端,由浏览器来管理,并且不同的网站有不同的cookie,而且同一个网站还有多个cookie,具体实现用域名+ID就可以了,这是浏览器的事情了。当用户访问一个站点的时候,会同时把这个站点的cookie一同发送过去,如果有保存cookie的话。服务器可以获得发送过来的cookie,在java里面是request.getCookie(),这样就可以处理cookie了,完了以后服务器要发送cookie给客户端,在java里面是response.addCookie()。

1.1 应用场景

我们一般的应用是记住登录密码,首次有服务器创建一个cookie,并写入帐号密码,然后发送给客户端保存,这里密码加密了,在客户端就算找到cookie也无法知道密码。下次客户端登录是发送cookie过去,我们就能验证密码,免登录了。这里还可以在cookie里面添加最长免登录天数,只要知道创建cookie的帐号密码条目的时间和当前时间就行。另外cookie还有很多属性,例如有生命周期,设置最大生命,当超过以后,浏览器就不会发送过去拉。

当然,浏览器可以禁用cookie,就是浏览站点是不会发送cookie,也不会接收cookie。

以下摘自wiki:

Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

网站可以利用cookies跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等。利用这些信息,一方面是可以为用户提供个性化的服务,另一方面,也可以作为了解所有用户行为的工具,对于网站经营策略的改进有一定参考价值。

1.3 Cookie格式

根据Netscape公司的规定,Cookie格式如下:

NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

2. 什么是Session

Session跟Cookie不一样,它更安全,因为它是保存在服务器的内存的,现在写过TCPIP服务器了,知道他是一个长期在跑的进程。那么当一个用户连接进来的时候,这是一个会话,当然这上下文环境还是要分不同的应用的,不是那么简单。原理就这样,accpet一个用户以后,就用开一片内存来存放会话信息,管理这些session是用hash表做的。也就是说对应一个用户有一个sessionID,这个SessionID对javaweb开发来说是透明的,所以要获取session并不需要提供sessionID。

2.1 应用场景

我们也用session来维持会话信息,但是session生命周期很短,而且不能太大,否则服务器内存就爆掉了。把内容放到session里面以后,再次请求就能找到上次的信息了。

在客户端,sessionID是保存在浏览器内存和cookie里面的,当用户发送请求时,服务器读取cookie里面是否有sessionID和是否过期,然后创建或者找到一个Seesion,这个对java开发者来说也是透明的,因此,需要只需要request.getSession()即可。如果浏览器禁止了cookie,那么seesionID不通过cookie发送到服务器,而是通过url发送过去。

3 其他

本来我是想利用这两个技术在blog上加上访问记录和是否喜欢这个blog的记录的,后来发现,这些记录必须要后台服务器运行才可以,前端运行在客户端,无法做到,通过cookie来做只是针对一个用户,不能统计所有的用户,而且如果用户清除了cookie的话,那么统计就要清零了,感觉没有什么用,于是不搞了。但,倒是学习了怎么来用js操作cookie,下面这个网站给出了很好的两个例子: js_cookie

后来,我注册了这个cnzz,外链一个js来统计一下blog的访问。


Sunday don't come easily! Subscribe to RSS Feed