关于session的问题,一直没有搞明白

citywanderer2005 2006-07-13 07:49:02
session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。
----------------------------
上面的我没有疑问。
第一次服务器相应客户端的请求时,会产生一个“Set-Cookie”的response header parameter,之后,客户端每连接一次服务器,sessionID不变,request头中会增加一个Cookie Parameter,response header不再有Cookie这个parameter,在客户端的Cookies文件夹中并没有发现相关的Cookie信息,那么客户端的sessionID保存在哪里呢?
...全文
324 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
emin_lee 2006-07-14
  • 打赏
  • 举报
回复
mark!
mrdangdong 2006-07-14
  • 打赏
  • 举报
回复
好呀
xueyi0108 2006-07-14
  • 打赏
  • 举报
回复
mark 学习
evilzydar 2006-07-14
  • 打赏
  • 举报
回复
mark~
yoyo82 2006-07-14
  • 打赏
  • 举报
回复
都说的很好!我就来接分好了。
kingdoom 2006-07-14
  • 打赏
  • 举报
回复
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID.

由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://……/xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764另一种是作为查询字符串附加在URL后面,表现形式为http://……/xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。

为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id.

另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单<form name="testform" action="/xxx"><input type="text"></form>

在被传递给客户端之前将被改写成<form name="testform" action="/xxx"><input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"><input type="text"></form>

这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。

实际上这种技术可以简单的用对action应用URL重写来代替。

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session.然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session.如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session.

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

ranranhu 2006-07-14
  • 打赏
  • 举报
回复
mark,关注下
pdvv 2006-07-14
  • 打赏
  • 举报
回复
标题:Session详解
--------------------------------------------------------------------------------
[评论]

作者:郎云鹏(dev2dev ID: hippiewolf)

摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。

目录:
一、术语session
二、HTTP协议与状态保持
三、理解cookie机制
四、理解session机制
五、理解javax.servlet.http.HttpSession
六、HttpSession常见问题
七、跨应用程序的session共享
八、总结
参考文档
……

http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10
piaopiao11 2006-07-14
  • 打赏
  • 举报
回复
所以当从已登陆的浏览器新建窗口也是登陆状态(同进程),但新开一个浏览器就没登陆(不同进程)
citywanderer2005 2006-07-14
  • 打赏
  • 举报
回复
保存在内存中?那大家的意思是浏览器进程拥有SESSIONID罗?
kingdoom 2006-07-13
  • 打赏
  • 举报
回复
SESSIONID是放你内存得,所以你关了那个网站在打开网页得时候还是你得SESSIONID
limbo1982 2006-07-13
  • 打赏
  • 举报
回复
楼上正解,对于这个问题楼主可以试试

选中浏览器的工具->INTERNET选项->隐私->高级->可以手动设置会话COOKIE,如果楼主把这个功能给关了,呵呵,就什么网站都登陆不上了...
interpb 2006-07-13
  • 打赏
  • 举报
回复
存储sessionID的是会话cookie 也就是存在于内存中而不保存在文件中的cookie

master_jt 2006-07-13
  • 打赏
  • 举报
回复
这要看创建cookie时的参数
cookie是可以设置过期时间的,如果设置了过期时间MaxAge,那么本地应该会有一个cookie文件
如果没有设置过期时间,或者setMaxAge(-1)那么这个cookie是在本次浏览有效,关了浏览器就丢弃了,那样是不会保存为本地cookie文件的

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧