浅谈session/cookie

Session 和Cookie是常用的Web跟踪技术。Cookie保存在客户端,而Session则保存在服务器端,二者结合使用来跟踪用户的会话状态,是http协议的一种扩展技术。之所以说是一种扩展技术,是由于Session和cookie是作为http协议的一种补充,用于弥补http协议的无状态特性而引入的,从而保持用户与服务器之间的状态信息。

1. Cookie机制

1.1 Cookie的功能

在Web程序中,保持会话的状态是很重要的一件事。理论上,应该为每个用户保持一个会话,同一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求应该属于另一个会话,用于区别不同的用户操作。以网上购物为例,A用户购买的任何商品应该放在A用户的购物车中,而B用户购买的所有物品应该放在B用户的购物车中,二者不属于同一个会话,因此彼此之间不能混淆。

Web应用程序使用过http协议传输数据的。http协议是一种无状态的协议,一旦一次数据交换完成,客户端与服务器之间的链接就会断开,再次交换数据需要建立新的链接,这也就是意味着http协议无法保持客户端与服务端之间的状态,跟踪用户的会话信息。同样以网购为例,当A用户购买了一种商品并放在自己的购物车中,当A用户再次购买商品的时候服务器已经无法判断该购买行为是否属于A用户,也就是说两次操作彼此之间没有任何的关联,造成用户操作的不便,严重影响用户的体验。为了能够跟踪特定用户的信息,需要一种能够记录该用户信息的技术,Cookie便是一种被广泛使用的技术。

简单来说,Cookie是在http协议下在客户端维护用户信息的一种方式,由Web服务器保存在用户端的一种小的文本文件,用于记录用户的信息,如ID,密码,浏览过的网页,停留的时间,个人设置等等信息。在Cookie的有效期内,如果用户访问以前访问过的某个站点,服务器通过读取Cookie采取相应的动作,如设置个性化的网页、用户不必重新输入用户名和密码就可以重新登录等等。

1.2 Cookie的工作原理

(1).用户在第一次访问某个网站的时候是客户端是不存在可用的Cookie的,当服务器接收到用户的请求之后,如果用户设置允许使用Cookie,那么服务器会将一部分信息连同请求的页面一起返回给用户,从而建立起Cookie。

(2).用户再次访问相同的网站,那么该浏览器会在用户的电脑上面寻找可用的Cookie,如果找到,则在发送的http请求的头部中将包含该Cookie,服务器通过检查该Cookie用于确定用户的信息。如果没有找到则说明是第一次浏览该网站,则使用(1)中的方式建立Cookie。

Cookie是利用网页代码中的 http请求的头部信息进行传递的,浏览器的每一次请求都可以伴随着Cookie传递。

1.3Cookie的有效期

有效期指的是Cookie记录的存放时间,可以通过设置Cookie的Expire字段进行调整。如果Cookie不设置超时事件的话,则存放在浏览器的内存中,那么伴随着浏览器的关闭Cookie会被清除掉;但是如果Cookie设置了生存期,则存放在客户的硬盘里面的话,那么即使浏览器关闭也不会造成Cookie的丢失,如果下次启动浏览器的时间在Cookie的生存期内,则该Cookie依然可以使用。

1.4设置Cookie的属性

Cookie的属性包括name, value, expire, path, domain,secure组成。

其中name代表的是Cookie的名字,value为对应的值;expire字段设置cookie的过期时间,以秒为单位;path设置Cookie的路径,该路径决定了可以访问该cookie的页面,一般而言与创建Cookie的页面处于同一个目录或者创建Cookie页面的子目录下的网页可以访问该Cookie。如果希望父级或者整个网页都能够使用Cookie,则需要进行路径的设置,如令path=/;域名domain能够解决在同一个域名下访问Cookie的问题,通过指定可访问Cookie的主机名来进行设置。例如“www.baiu.com"与"mp3.baidu.com"公用一个关联的域名“baidu.com",如果想要让”www.baidu.com"下的Cookie能够被“mp3.baidu.com”访问,我们就需要用到Cookie的domain属性,并且需要把path设置为"/";secure用于决定该cookie是否采用安全的协议(https,ssl等)进行传输。

2. Session机制

2.1 Session的功能

Session的功能与Cookie的功能是相同的,只是所在的位置不同。Cookie用于在客户端记录用户的状态信息,Session用于在服务器端存储用户会话所需要的属性及配置信息,这样当用户在应用程序的Web页面之间跳转的时候,存储在Session对象中的变量将不会丢失,而是在整个用户的会话期间一直保持下去。

2.2 Session的工作机制

(1).用户在第一次访问一个服务站点的时候,Session被自动创建,生成唯一的session id,如果允许使用Cookie,则这个唯一的标示也会随着服务器回复的请求返回给用户并保存在Cookie中。当然也不是访问所有的站点都会生成对应的Session,只有在访问JSP、Servelet等Web程序的时候创建对应的Session,而访问诸如HTML、IMAGE等静态的Web应用程序的时候并不会创建Session。

(2).(php中)首先使用session_start()函数,php中从session库中加载已经存在的session变量;当执行脚本语言的时候使用session_register()注册session变量;脚本执行结束的时候,未被销毁的session变量会被自动保存在本地的一定路径下的session库库中,以备下次加载使用,以腾出内存供其余的用户使用,不致于导致内存的溢出。

2.3 Session的有效期

在服务器端保存的session不管客户端是否还需要Session,并且服务器也无法确定客户端什么时候再次需要Session,但是如果不及时销毁session的话,很快就会造成服务器的内存不足。为了能够有足够的内存共后来的用户使用,创建Session的时候为Session设置了声明周期。

销毁销毁一个Session只能通过两种方式:

(1).显示调用session.invalidate()方法。

(2).Session超出其生命周期。Session生成之后,只要用户继续访问,服务器就会及时更新用户对应的Session。用户每访问该网站一次,无论是否读写Session,服务器都会认为该用户的Session活动了一次。如果用户的Session创建于上午10:00,而其声明周期设置为20分钟的话,则如果用户在10:00-10:20没有活动的话,Session被销毁;若用户在10:10重新访问该网页,则其有效期持续到10:30.

2.4 Session的方法名和说明

void setAttribute(String attribute,Object value)                    设置Session属性

string getAttribute(String attribute)                                    获取Session属性

Enumeration getAttributeNames()                                       获取Session中存在的属性名

void removeAttribute(string attribute)                                 移除Session属性

String getId()                                                                   返回Session的ID。该ID由服务器自动创建,不会重复。

long getCreationTime()                                                      返回Session的创建日期。返回类型为long,经常被转化为Date类型,如Date createtime=new Date(session.                                                                                                 getCreationTime())

long getLastAccessedTime()                                               返回Session的最后活跃时间,同样可以转化为Date.

int getMaxInactiveInterval()                                               返回Session的超时事件,单位为秒

void setMaxInactiveInterval(int second)                               设置Session的最大超时时间

void putValue(string attribute, Object value)                        不建议使用,已被setAttribute(string attr)所取代

Object getValue(string attribute)                                        不建议使用,已经被getAttribute(string attr)所取代

boolean isNew()                                                                返回Session是否是最新创建的

void invaliddate()                                                              使该Session失效

以上各个函数相对于Session对象,在不同的语言中可能会有会有不同的实现。例如php中的session_destroy()用于清除一个session文件,session_unset()用于清除内存中的session记录。

虽然Session对于用户而言是透明的,但是Session的实现需要客户端的某些支持。Session的使用需要Cookie作为标志,http协议是无状态的,Session无法依据http协议判断两次请求是否是同一用户。当用户请求在服务端得到响应之后,服务端会发送名为JSESSIONID的cookie给客户端,其值为该Session的id。Session依据该Cookie判断是否为同一个用户。该Cookie是服务器自动生成的,一般仅在当前浏览器内有效,并且在浏览器的窗口间不共享,关闭浏览器则失效。因此同一台电脑的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的窗口(也就是不是重新双击浏览器图标等打开的窗口)除外。由浏览器窗口内的链接、脚本等打开的窗口共享父窗口的Cookie,因此会共享同一个Session。例如,通过单击鼠标右键在弹出的快捷键菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session。

2.5 Session对于Cookie的依赖特性

如果客户端在浏览器的设置中禁止使用Cookie,则采用URL重写的方案代替。URL地址重写是将该用的Session id信息重写到URL地址中。服务器根据重新的URL获取Session的id。

总结:

Session与Cookie往往是结合使用,从而发挥强大的作用。打个比方来说,用户是某家商场的会员,那么用户拥有该商场分配给该用户的ID或者是持有该商场的会员卡。用户每次购物都会出示自己的会员卡或者是直接告诉店员自己在该商场的ID,用于表明自己的身份,这就是Cookie的作用,是表明用户身份的“证件"。但是用户出示了会员卡或者是用户说出了自己的ID,那么商场的柜员会在自己的系统或者记录中寻找该用户的信息,商场中保存用户信息的系统或者记录就是Session,是用于核对用户信息的一种机制。

上一篇:EF相关知识


下一篇:iOS中使用正则