论坛首页 Java企业应用论坛

HttpSession的实现和cookie机制

浏览 14889 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-02-01  
java web服务器通过实现httpsession来保存客户端的状态(jsessionid),也就是我们通常说的session。session是通过cookie机制来实现(网上说如果客户端禁用了cookie,则可以通过url重写来实现,一会再讨论。。)。
1、session的生成
在客户端第一次请求jsp页面,或servlet时生成,并向客户端写一个标识,即:jsessionid
由请求返回的http协议串可以看出:
请求:
POST /ibsm/LoginAction.do HTTP/1.1
Accept: 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-cn
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-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:8080
Content-Length: 42
Connection: Keep-Alive
Cache-Control: no-cache

code=lyc&password=123&actType=ywgl&userId=

响应:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E; Path=/ibsm
Content-Type: text/html;charset=GBK
Content-Length: 436
Date: Mon, 01 Feb 2010 05:18:06 GMT

由响应的第三行可以看出生成的标识:JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E
2、session的使用
在session生成以后,以后请求时,都会自动发送上边生成的标识。浏览器后台发送的请求报文如下:
GET /ibsm/ApplicationFrame.frame HTTP/1.1
Accept: 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-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-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:8080
Connection: Keep-Alive
Cookie: 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。
   发表时间:2010-02-01  
1>系统盘下有 Cookies 文件夹。
sessioncookie 有默认的name JSESSIONID ,只存于浏览器内存中。
persistent cookies 由开发者自己设定。

2>这个要调用一个encode url的方法,服务器才会去自动添加jsessionid=*******。
0 请登录后投票
   发表时间:2010-02-01  
谢谢楼上的回复。对于2,encode url是要自己手动去调用吗?我感觉这个应该是服务器自己实现的吧。
0 请登录后投票
   发表时间:2010-02-03   最后修改:2010-02-03
URL重写实现原理:
Web Server在返回Response的时候,检查页面中所有的URL,包括所有的连接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。
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()); 
} 
0 请登录后投票
   发表时间:2010-02-03  
贴一点自己的总结吧,有不对的地方高手评论一下吧:

关闭cookie的两种方式:
1 服务器关闭cookie
修改tomcat安装目录conf/context.xml的<Context标签>
    <Context cookies="false">。
    这种情况下即使客户端使用cookie服务器端也会忽略。
2 客户端关闭cookie
浏览器关闭cookie。


关闭cookie后客户端如何向服务器表明处于同一个cookie?
base_url/app/servlet;jsessionid=07D64A6477D95A74A9C8D48DC435EEA0

上面的链接如何获取?
在servlet中使用
String url = response.encodeURL(request.getRequestURI());
这样,客户端可以使用这个url来track session。
0 请登录后投票
   发表时间:2010-02-03  
客户端禁用cookie是不是只是禁止持久化cookie,而像jsessionid这种cookie是在内存之中,不会受到影响,所以还是采用的cookie方式访问的?
我只是这样想,我测试的也是这样。谁能给点可以令人信服的资料
0 请登录后投票
   发表时间:2010-02-03  
guazi 写道
客户端禁用cookie是不是只是禁止持久化cookie,而像jsessionid这种cookie是在内存之中,不会受到影响,所以还是采用的cookie方式访问的?
我只是这样想,我测试的也是这样。谁能给点可以令人信服的资料


这块实现是取决浏览器的,看这篇文章
http://www.ibm.com/developerworks/cn/java/j-cookie/
cookie有一些规范,但是浏览器不一定都实现。举个例子,服务器发客户端消息:
Set-Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E; Path=/ibsm

tomcat服务器并没有提供expires字段,按照Netscape Cookies的规范,
EXPIRES=dateValue specifies a date string that defines the valid life time of that cookie. Once the expiration date has been reached, the cookie will no longer be stored or given out. If you do not specify dateValue, the cookie expires when the user's session ends.

意思是如果没有提供这个字段,cookie将会在user session结束后到期(到期就不会被保存)。但是什么是user session ends, 什么又是 "be stored",这些都没有说清,所以这些其实和浏览器的实现是密切相关的。


在firefox用firebug试验,如果浏览器禁用了cookie,浏览器会忽略Set-Cookie头,如果浏览器不禁用cookie,对于下面的头
Set-Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E; Path=/ibsm
firefox是会在磁盘上保存cookie的,而且可以看到浏览器显示这个cookie的过期时间是“当会话结束时”,但是我关了浏览器,再重新打开,发现这个cookie还在,所以“当会话结束时”这段文字本身就是模糊的,浏览器怎么实现都行。
1 请登录后投票
   发表时间:2010-02-03  
可能对
Set-Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E; Path=/ibsm

有的浏览器是把cookie保存在内存里的,没有做试验,但是firefox是持久化了的。应该是不存在cookie持久化和非持久化一说的,取决于浏览器的实现。
0 请登录后投票
   发表时间:2010-02-03  
http://sunrisetg.iteye.com/admin/blogs/573362
0 请登录后投票
   发表时间:2010-02-04  
感谢robertliudeqiang。确实是各个浏览器的处理不一样。
在firefox中禁用了cookie后,确实没有了cookie,浏览器发送请求如下:
Host	localhost:8080
User-Agent	Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6
Accept	text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language	zh-cn,zh;q=0.5
Accept-Encoding	gzip,deflate
Accept-Charset	GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive	115
Connection	keep-alive
Referer	http://localhost:8080/ibsm/ApplicationFrame.frame

在ie7中禁用cookie后,发送请求如下:
GET /ibsm/ApplicationFrame.frame?block=menuFrame HTTP/1.1
Accept: 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.frame
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Connection: Keep-Alive
Cookie: JSESSIONID=191861A4C2331978793F62DD585CC2F0
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics