首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

HttpSession的实现跟cookie机制

2013-09-11 
HttpSession的实现和cookie机制java web服务器通过实现httpsession来保存客户端的状态(jsessionid),也就是

HttpSession的实现和cookie机制
java web服务器通过实现httpsession来保存客户端的状态(jsessionid),也就是我们通常说的session。session是通过cookie机制来实现(网上说如果客户端禁用了cookie,则可以通过url重写来实现,一会再讨论。。)。
1、session的生成
在客户端第一次请求jsp页面,或servlet时生成,并向客户端写一个标识,即:jsessionid
由请求返回的http协议串可以看出:

请求:POST /ibsm/LoginAction.do HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Referer: http://192.168.3.197:8080/ibsm/Accept-Language: zh-cnContent-Type: application/x-www-form-urlencodedUA-CPU: x86Accept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)Host: 192.168.3.197:8080Content-Length: 42Connection: Keep-AliveCache-Control: no-cachecode=lyc&password=123&actType=ywgl&userId=响应:HTTP/1.1 200 OKServer: Apache-Coyote/1.1Set-Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E; Path=/ibsmContent-Type: text/html;charset=GBKContent-Length: 436Date: Mon, 01 Feb 2010 05:18:06 GMT

由响应的第三行可以看出生成的标识:JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E
2、session的使用
在session生成以后,以后请求时,都会自动发送上边生成的标识。浏览器后台发送的请求报文如下:
GET /ibsm/ApplicationFrame.frame HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Accept-Language: zh-cnUA-CPU: x86Accept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)Host: 192.168.3.197:8080Connection: Keep-AliveCookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E

可以看到最后一行就是生成的jsessionid
3、session的失效与销毁
a、session超时,这个依赖与服务器端的设置(web.xml中的配置session超时时间),过了这个时间,session将被销毁。
b、关闭浏览器,此时session不一定被销毁,但是已经失效,因为session只能在一个窗口内使用,(不讨论经其他手段在多个窗口中获取同一个session)。session的销毁要到超时才能自动销毁。
c、退出应用。如果在退出应用的方法中调用了销毁session的方法,则session被销毁。否则不会销毁,等待超时自动销毁。

以上说法出自本人实践。
有一些疑问希望各同仁能帮我搞懂:
1、cookie的位置在哪儿?我找不到。网上有这种解释:
以persistent cookies和session cookie来区分两种cookie,说sessioncookie只存在内存中,不会持久化到硬盘。所以看不到,是不是这样的?如果是这样浏览器是如何来区分两种cookie的?
2、有文章说,如果客户端禁用cookie,则服务器会通过url重新来把jsessionid附加在url之后(***.jsp?jsessionid=*******),这又是如何实现的?能否给点资料看看。对此,还有一点疑问:我在机器上禁用了所有cookie之后,发现请求的报文没有改变,依然带着:
Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E
谁能给一个合理的解释。我用的浏览器是ie7。org.apache.coyote.tomcat5.CoyoteResponse类的toEncoded()方法支持URL重写。 String toEncoded(String url, String sessionId) { … StringBuffer sb = new StringBuffer(path); if( sb.length() > 0 ) { // jsessionid can't be first. sb.append(";jsessionid="); sb.append(sessionId); } sb.append(anchor); sb.append(query); return (sb.toString()); } Hostlocalhost:8080User-AgentMozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6Accepttext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Languagezh-cn,zh;q=0.5Accept-Encodinggzip,deflateAccept-CharsetGB2312,utf-8;q=0.7,*;q=0.7Keep-Alive115Connectionkeep-aliveRefererhttp://localhost:8080/ibsm/ApplicationFrame.frame
在ie7中禁用cookie后,发送请求如下:
GET /ibsm/ApplicationFrame.frame?block=menuFrame HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Referer: http://localhost:8080/ibsm/ApplicationFrame.frameAccept-Language: zh-cnUA-CPU: x86Accept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)Host: localhost:8080Connection: Keep-AliveCookie: JSESSIONID=191861A4C2331978793F62DD585CC2F0
10 楼 zhouweijava 2010-02-04   robertliudeqiang 写道可能对
Set-Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E; Path=/ibsm

有的浏览器是把cookie保存在内存里的,没有做试验,但是firefox是持久化了的。应该是不存在cookie持久化和非持久化一说的,取决于浏览器的实现。

+1

热点排行