很长时间一直对httpsession(即我们常说的session)感觉理解不是很清楚.网上也有很多人发表关于session的看法.感觉有好多人有些误解.于是查了一些资料.对session做了一个总结.首先要说一下http协议.它是一个无状态协议.他的过程如下:连接-请求-应答-关闭连接,首先 客户机与服务器建立联系,然后客户向服务器提出请求.服务器对请求作出应答,最后服务器关闭连接.就像我们打电话一样.但是当我们挂了电话又去拨通电话想继续刚才的话题..如果我们不告诉对方是谁.对方也不知道你是谁,也不知道该和你说什么.这就需要我们告诉对方我们的名字就如sessionID.这样对方才能知道我们是谁.下面详细说一下session从开始到结束的一个生命周期.当客户端对服务器提出第一个请求时.服务器会生成一个httpSesssion对象.同时把用户存到session的信息存到这个对象里.最关键的是服务端容器会为这个session分配一个sessionID来唯一标识这个对象(感觉session容器应该是做了一个hashMap以sessionID作为key值以session对象作为value).此时服务端处理完客户端的请求对其作出反应时会把这个sessionID也传回给客户端,当下一次客户端提出请求时会把这个sessionID传过去.这样session容器就可以根据sessionID取得相应的session对象.同时我们还需要了解一下sessionID在客户端的保存和传递.当客户端得到sessionID时可能会存到cookie或者放到浏览器的缓存里或者放到其他的地方这取决于浏览器的管理机制.我开始做了几次试验看是不是存到cookie里,就是登陆一个系统然后把我的cookie清空.结果发现我的session信息依然还在,我当时以为sesssionID肯定没有存到cookie里.后来经猪头队长指点才知道浏览器写cookie时可能会有信息就写,也可能会当你关闭浏览器时才写cookie.但是不论浏览器把sessionID放在那里.可以确定的一点当我们关闭浏览器再次启动时即便sessionID写到了cookie里,浏览器的也不会去读.也就是说我们再也无法找到以前的sessionID. 即便服务端的session容器里的httpSession对象还没有到期,我们也无法取得这个对象了. 既然我们了解了sessionID的保存,下面我们再了解一下sessionID的传递.sessionID的传递一共有三种情况,第一种和cookie有关,通常情况下sessionID是保存在cookie里的,当客户端向服务端提出请求时,会把sessionID放在http请求的信息里,第二种J2EE提供的一个办法URL重写,写超链接的时侯,总是用response.encodeURL(url),连接就会变成*.jsp?sessionID=......,完成了原来用cookie完成的功能。第三种情况我不是很清楚引用以为网友的理解:叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单form name=testform action=/xxxinput type=text/form在被传递给客户端之前将被改写成form name=testform action=/xxxinput type=hidden name=jsessionid value=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764input type=text/form这种技术现在已较少应用,实际上这种技术可以简单的用对action应用URL重写来代替。当我们把sessioID传过去了以后,就是session容器根据相应的ID来去相应的对象了,直到这个session失效.