浏览 14898 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-01
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。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-02-01
1>系统盘下有 Cookies 文件夹。
sessioncookie 有默认的name JSESSIONID ,只存于浏览器内存中。 persistent cookies 由开发者自己设定。 2>这个要调用一个encode url的方法,服务器才会去自动添加jsessionid=*******。 |
|
返回顶楼 | |
发表时间:2010-02-01
谢谢楼上的回复。对于2,encode url是要自己手动去调用吗?我感觉这个应该是服务器自己实现的吧。
|
|
返回顶楼 | |
发表时间: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()); } |
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间:2010-02-03
客户端禁用cookie是不是只是禁止持久化cookie,而像jsessionid这种cookie是在内存之中,不会受到影响,所以还是采用的cookie方式访问的?
我只是这样想,我测试的也是这样。谁能给点可以令人信服的资料 |
|
返回顶楼 | |
发表时间: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还在,所以“当会话结束时”这段文字本身就是模糊的,浏览器怎么实现都行。 |
|
返回顶楼 | |
发表时间:2010-02-03
可能对
Set-Cookie: JSESSIONID=1442A671BEEDA147A2756B7E083D3B7E; Path=/ibsm 有的浏览器是把cookie保存在内存里的,没有做试验,但是firefox是持久化了的。应该是不存在cookie持久化和非持久化一说的,取决于浏览器的实现。 |
|
返回顶楼 | |
发表时间:2010-02-03
http://sunrisetg.iteye.com/admin/blogs/573362
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |