浅谈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,是用于核对用户信息的一种机制。

时间: 2024-10-12 16:53:20

浅谈session/cookie的相关文章

浅谈session,cookie,sessionStorage,localStorage的区别及应用场景

浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器用户身份的会话方式. 区别: 1.保持状态:cookie保存在浏览器端,session保存在服务器端 2.使用方式: (1)cookie机制:如果不在浏览器中设置过期时间,cookie被保存在内存中,生命周期随浏览器的关闭而结束,这种cookie简称会话cookie.如果在浏览器中设置了cookie

[转] 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景

浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器用户身份的会话方式. 区别: 1.保持状态:cookie保存在浏览器端,session保存在服务器端 2.使用方式: (1)cookie机制:如果不在浏览器中设置过期时间,cookie被保存在内存中,生命周期随浏览器的关闭而结束,这种cookie简称会话cookie.如果在浏览器中设置了cookie

浅谈Session的使用(原创)

目录 浅谈Session的使用(原创) 1.引言 2.Session域的生命周期 2.1 Session的创建 2.2 Session的销毁 3.那么,session被销毁后,其中存放的属性不就都访问不到了吗,有何良策? 3.1 Cookie与session的相伴相生 3.2 Session活化钝化自力更生 最后 浅谈Session的使用(原创) 1.引言 ? 在java中Session域对象能将数据存储在服务器端,它可以存放各种类别的数据,相比只能存储字符串的cookie,能给开发人员存储数据

浅谈Session与Cookie的区别与联系

一.Session的概念 Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器.当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session. 一般情况下,服务器会在一定时间

浅谈HTTP Cookie 的 Secure 和 HTTPONLY属性

最近工作中遇到了关于cookie的secure及httponly属性的问题,所以关注并学习了一段时间,这里做一下简要记录.关于secure和httponly标志的用途可以参考wikipedia. 起因:系统PHP升级(5.1.7->5.4.5)并要求在下个升级后更新/etc/php.ini下的两个变量,设定值为1. Session.cookie_secure=1 Session.cookie_httponly=1 由此引发了这次调查,调查的内容涉及到了php自身cookie函数.开源框架Code

浅谈session测试

Session 是用于保持状态的基于 Web 服务器的方法,在 Web 服务器上保持用户的状态信息供在任何时间从任何页访问.Session 允许通过将对象存储在 Web 服务器的内存中在整个用户会话过程中保持任何对象.当我们使用用户名和密码登陆网站,系统会首先验证当前登陆用户是否合法,当合法后将用户名等相关信息保存在Session 中.登陆后点击进入某功能页面时,系统也会去判断当前你是否有访问权限,判断的方式是验证Session 中的内容是否正确. 在测试的过程中,怎样去测试Session 是否

浅谈 Cookie 与 Session 的区别

1.cookie机制 Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器.IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范.网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求附上这些cookies . 具体来说cookie机制采用的是在客户端保持会话状态的方案.它是在用户端的会话状态的存贮机制,他需要用户

(进阶篇)浅谈COOKIE和SESSION关系和区别

COOKIE介绍 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 cookie 的值. 1.设置Cookie PHP用SetCookie函数来设置Cookie. SetCookie函数定义了一个Cookie,并且把它附加在HTTP头的后面,SetCookie函数的原型如下: int SetCookie(string name, string value, int exp

ASP.NET中Session的个人浅谈

看到博客园的一个哥们写的面试经历,想到了面试中常问到的Session,一时手痒就谈下自己对Session的理解,这东西最开始在用户登录登出的时候用到过,后来一直没怎么用过,里面还是有很多知识点值得注意的.先简单的说下吧,Session是分为客户端Session和服务端Session: 客户端Session Session称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息,当用户首次与Web服务器建立连接的时候,服务器会给当前访问用户分发一个 SessionID作为标