Session与Cookie概念

时间:2022-11-15 01:04:25

摘:
一、Session机制
session是一种服务器端的状态管理技术,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 -- 称为session id,如果已包含一个session
id则说明以前已经为此客户端创建过session,服务器按照session
id把这个session检索出来使用,如果客户端请求不包含session
id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session
id的值是一个既不会重复,又不容易被找到规律以仿照的字符串,这个session id将被在本次响应中返回给客户端保存。

保存这个session

id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。 
由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。有两种方式:
经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。而附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

,另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
这两种方式对于用户来说 是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种 方式有利于把session id的信息和正常程序参数区分开。
为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
另一种技术叫做表单隐藏字段(这种技术现已不常使用)。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单:   
     <form name="testform" action="/xxx"> 
    <input type="text"> 
    </form> 
    在被传递给客户端之前将被改写成: 
    <form name="testform" action="/xxx"> 
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 
    <input type="text">

</form>

二、误解 “只要关闭浏览器,session就消失了”

程序一般都是在用户做log

off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session
id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。

session何时被删除:

1)程序调用HttpSession.invalidate()

2)距离上一次收到客户端发送的session id时间间隔超过了session的超时设置

3)服务器进程被停止(非持久session)

三、cookie

1、服务器临时保存在浏览器的少量数据。

当浏览器向服务器发送请求里,服务器会将少量的数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据临时保存下来;当浏览器两次访问服务器里,会将之前保存的数据以cookie消息头的方式发送给服务器。

cookie只能保存合法的ASCII码(iso-8859-1)字符串。如果需要保存中文,需要将中文转换成合法的ASCII字符串的形式。

2、cookie的生存时间:

cookie.setMaxAge(int seconds)

注意:

i: 单位是秒。

ii: 当seconds>0时,表示当cookie的生存时间大于指定的秒数,浏览器会删除这个cookie。

当seconds=0时,表示立即删除。

当seconds<0时,缺省值,浏览器会将cookie保存在内存里面。只要浏览器不关闭,cookie就一直存在

如果新的cookie名字和旧的cookie名字相同,会将旧的cookie覆盖。

四、session对比cookie

session相对于cookie来说:

优点是:

安全;

可以保存更多的数据(cookie只能保存4k左右的数据);

可以放更丰富的数据类型(cookie只能保存字符串)。

缺点:

session技术会将状态(即数据)都保存在服务器端,所以,当访问量大的时候,服务器的内存空间占用比较大。