`
guazi
  • 浏览: 54622 次
  • 性别: 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=*******。

相关推荐

    Cookie机制和Session机制

    ### Cookie机制和Session机制 #### 一、基本概念与背景 在现代Web应用中,为了实现用户认证、个性化设置等功能,通常需要在客户端与服务器之间维持一段时间内的状态信息。然而,HTTP协议本质上是无状态的,这意味...

    Cookie与Session机制

    #### 二、Cookie机制 ##### 1. Cookie的概念 Cookie是一种简单的机制,用于在客户端存储信息以便后续的请求中使用。它最初是由Netscape社区开发并在W3C的标准中得到采纳,几乎所有现代浏览器都支持Cookie。 #####...

    session机制与cookie机制(来源于IT168)

    【标题】:“session机制与cookie机制(来源于IT168)” 【描述】:这篇文章讨论了session和cookie在Web开发中的重要角色,解释了它们如何帮助维持用户状态,并且介绍了这两种机制的基本概念。 【标签】:“session...

    httpSession

    在Web开发中,httpSession是服务器用于跟踪用户状态的一种机制。由于HTTP协议本身是无状态的,即服务器无法识别连续发送请求的同一客户端,因此引入了session来解决这个问题。 在Web应用程序中,当用户打开浏览器...

    spring websocket获取httpsession

    在Spring框架中,WebSocket是一种用于实现双向通信的技术,它可以提供实时、低延迟的数据传输,而HttpSession则是HTTP协议中用于跟踪用户会话的一种机制。在Spring 4版本中,我们经常需要结合WebSocket与HttpSession...

    Cookie与session机制详解

    ### Cookie与Session机制详解 #### 一、Cookie与Session的概念及区别 在Web开发中,为了保持用户的状态信息,通常会用到两种技术:Cookie...此外,还可以结合使用Cookie和Session来实现更复杂的功能,如自动登录等。

    cookie和session示例

    在Web开发中,Cookie和Session是两种非常重要的用户状态管理机制。它们被广泛用于跟踪用户的登录状态、个性化设置等,确保用户在不同页面之间切换时能够保持一致性体验。接下来,我们将详细探讨Cookie和Session的...

    cookie

    标签“源码”意味着该文章可能包含了对Cookie机制的源代码解析,帮助读者理解其内部工作流程。而“工具”可能指的是与Cookie管理相关的开发者工具或者辅助库,如浏览器的开发者工具或者某种编程框架提供的Cookie操作...

    day16_cookie&session源代码.zip

    在IT行业中,尤其是在Web开发领域,Cookie和Session是两种非常重要的技术,用于管理用户状态和保持会话。这里我们深入探讨这两个概念以及它们在Java Web中的应用。 首先,Cookie是客户端存储的小型文本文件,由...

    JAVA之cookie与session

    ### JAVA之cookie与session #### 一、Cookie与Session的概念 **Cookie** 与 **Session** 是两种...在实际开发过程中,合理利用 Cookie 和 Session 的特性,可以有效提升用户体验,同时确保应用程序的安全性和稳定性。

    学习cookie的笔记和总结

    ### 学习cookie的笔记和总结 #### 一、什么是Cookie? Cookie是一种小型的数据文件,由服务器发送到用户的浏览器,并存储在用户计算机上的一种机制。它主要用于保存用户的偏好设置、登录状态等信息,以便用户再次...

    session的跟踪机制

    ### Session的跟踪机制详解 #### 一、Session与Cookie的区别 ...通过对Session机制的深入理解,我们可以更好地设计和实现复杂的功能,比如购物车、用户认证等,从而提升Web应用的整体质量和性能。

    Servlet对Cookie和Session的管理源码实例

    虽然Cookie和Session主要依赖浏览器,但可以通过其他方式实现后台跟踪,如使用数据库或分布式缓存存储会话数据。这种方式通常用于跨域应用或移动应用,其中Session ID可以通过非HTTP方式传递(如WebSocket、API调用...

    08Cookie和Session1

    **Cookie机制** 1. **基本概念**:Cookie是由W3C组织提出并由Netscape社区发展的一种机制,它弥补了HTTP协议无状态的缺陷。服务器通过在客户端(浏览器)存储一小段文本信息(Cookie)来识别用户身份。当客户端再次...

    cookie session 的概念和基本用法

    服务器通过解析请求头中的Cookie来识别用户,实现会话跟踪。 **Session的基本操作** 1. **获取Session**:在Java Web开发中,通过`HttpServletRequest.getSession()`或`HttpServletRequest.getSession(true/false)...

    session实质就是cookie

    为了实现这些功能,Web开发人员常使用两种主要的技术:Cookie与Session。 #### 二、Cookie技术 ##### 2.1 Cookie概述 **Cookie**是一种简单的文本文件,由服务器端创建并在客户端(通常是用户的浏览器)上进行...

    servlet+cookie和Session

    **Cookie和Session**是两种常见的会话管理机制。Cookie是存储在客户端的小型数据块,常用于保持登录状态、个性化设置等。Servlet中,可以通过`response.addCookie()`添加Cookie,`request.getCookies()`获取Cookie。...

    java中cookie,session,验证码的应用实例!

    在Web应用中,Cookie常用于实现会话持久化,比如保存用户的登录状态。Java中,可以通过HttpServletResponse接口的addCookie方法添加Cookie,HttpServletRequest接口的getCookies方法获取Cookie。例如: ```java // ...

Global site tag (gtag.js) - Google Analytics