`
guazi
  • 浏览: 53666 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

HttpSession的实现和cookie机制

    博客分类:
  • java
阅读更多
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。
分享到:
评论
10 楼 zhouweijava 2010-02-04  
robertliudeqiang 写道
可能对
Set-Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E; Path=/ibsm

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


+1
9 楼 guazi 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
8 楼 sunrisetg 2010-02-03  
http://sunrisetg.iteye.com/admin/blogs/573362
7 楼 robertliudeqiang 2010-02-03  
可能对
Set-Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E; Path=/ibsm

有的浏览器是把cookie保存在内存里的,没有做试验,但是firefox是持久化了的。应该是不存在cookie持久化和非持久化一说的,取决于浏览器的实现。
6 楼 robertliudeqiang 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还在,所以“当会话结束时”这段文字本身就是模糊的,浏览器怎么实现都行。
5 楼 guazi 2010-02-03  
客户端禁用cookie是不是只是禁止持久化cookie,而像jsessionid这种cookie是在内存之中,不会受到影响,所以还是采用的cookie方式访问的?
我只是这样想,我测试的也是这样。谁能给点可以令人信服的资料
4 楼 robertliudeqiang 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。
3 楼 guazi 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() &gt; 0 ) { // jsessionid can't be first. 
            sb.append(";jsessionid="); 
            sb.append(sessionId); 
        } 
        sb.append(anchor); 
        sb.append(query); 
        return (sb.toString()); 
} 
2 楼 guazi 2010-02-01  
谢谢楼上的回复。对于2,encode url是要自己手动去调用吗?我感觉这个应该是服务器自己实现的吧。
1 楼 vvggsky 2010-02-01  
1>系统盘下有 Cookies 文件夹。
sessioncookie 有默认的name JSESSIONID ,只存于浏览器内存中。
persistent cookies 由开发者自己设定。

2>这个要调用一个encode url的方法,服务器才会去自动添加jsessionid=*******。

相关推荐

    java-servlet-api.doc

    如果有助于你处理应用的数据需求,你也许需要绑定对象到Session中,你可以通过一个唯一的名字绑定任何的对象到Session中,这时,你需要使用HttpSession对象。任何绑定到Session上的对象都可以被处理同一会话的...

    千方百计笔试题大全

    46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型...

    java面试宝典

    46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型...

    超级有影响力霸气的Java面试题大全文档

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    深入Java Servlet网络编程

    11. 3 Applet和Servlet之间实现远程方法调用 11. 3. 1 远程方法调用中的设计模式 11. 3. 2 设计应用程序子协议 11. 3. 3 远程方法调用的实例 第12章 在Servlet中发送和接收邮件 12. 1 电子邮件协议 12. 2 利用...

    java 面试题 总结

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    在知识的讲解上,本书采用理论与实践相结合的方式,从程序运行的内部机制进行分析讲解,并通过大量的实例和实验来验证并运用本书的知识。.. 本书语言生动、通俗易懂、讲解细致,大部分章节都提供了多个例子,而且很...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    在知识的讲解上,本书采用理论与实践相结合的方式,从程序运行的内部机制进行分析讲解,并通过大量的实例和实验来验证并运用本书的知识。.. 本书语言生动、通俗易懂、讲解细致,大部分章节都提供了多个例子,而且很...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    在知识的讲解上,本书采用理论与实践相结合的方式,从程序运行的内部机制进行分析讲解,并通过大量的实例和实验来验证并运用本书的知识。.. 本书语言生动、通俗易懂、讲解细致,大部分章节都提供了多个例子,而且很...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    在知识的讲解上,本书采用理论与实践相结合的方式,从程序运行的内部机制进行分析讲解,并通过大量的实例和实验来验证并运用本书的知识。.. 本书语言生动、通俗易懂、讲解细致,大部分章节都提供了多个例子,而且很...

Global site tag (gtag.js) - Google Analytics