关闭浏览器之后session是否就消失了???

我的服务中有一个用户注册网页,注册后向servlet发送post请求,然后servlet建立session,设置一些用户访问属性。
当用户以后再次访问服务的时候,我希望服务能够识别出客户,找出以前建立的session,然后读取它的属性。

实际效果是,如果我不关闭浏览器,以后再次访问时服务能够找出以前建立的session,就是说,它还认识我。但是如果我关闭了浏览器,以后再次访问时服务会建立一个新的session,导致读取属性时抛出NullPointerException,也就是说,它已经不再认识我了。

可是许多网站,只要你注册过一次,以后你怎么访问它都能认出你!我应该怎么做呢?

我把压缩包放在这里,请大家帮我看看,谢谢!
wwlhp@jdon.comY5y7NrbB7C.rar

请设定session的存活期,否则系统Mo 认关闭browser后,session die

session.setMaxInactiveInterval(-1);
我设定的session永久不会timeout! 可还是不管用!

服务器端并不能捕获客户端的浏览器关闭事件,因此你关闭浏览器以后,服务器端那个Session还是存在的,要超时以后才被回收,启动一个新的浏览器会启动一个新的session,所以他不认你了
session永不过期是愚蠢透顶的做法,session将只增不减,你有多少内存?

自动登录都是用Cookie实现的,登录后给客户端一个Cookie,以后浏览器每次都发送发送那个Cookie给服务器端,然后实现自动登录

》》可是许多网站,只要你注册过一次,以后你怎么访问它都能认出你!我应该怎么做呢?
你把浏览器的Cookie都清除掉,看他下次还认识你不?

实际上session通常也是通过Cookie实现的

session靠Cookie来维持,每次给客户端一个cookie里面存放session id,然后请求的时候,服务器根据session id找到对应的session。这个cookie是在浏览器关闭的时候就实效的,自动登录的cookie需要设置成为关闭浏览器后还有效的那种。

谢谢AreYouOK!
不过我还有句话不理解,你说“session永不过期是愚蠢透顶的做法,session将只增不减,你有多少内存?”,能给我仔细解释一下么?

我觉得像自动登陆的这类网站,它给客户发送cookie的同时,在服务器端也是要保留一小片跟cookie对应的数据,而且这些数据也是要永驻服务器端的,对吧?那么随着客户的增加,这些数据也会积累的非常巨大。

每一个session是通过自己的session id来识别的。

session id在 浏览器打开的时候是自动通过cookie在各个网页内通信的。
如果你关掉浏览器,这个cookie过期,所以下次你找不到上次的session 了。
将每个用户的session id存到数据库中,在用户登陆时,先取出这个session id ,根据这个session id 取session,如果session不为空,就直接使用这个session,跳过登陆过程,否则需要重新登陆一次。


session id 通过get或者head标头传送,这样即使客户端浏览器禁止了cookie 你还可以使用session。否则,cookie禁止,session机制就失效了。

AreYouOK? 的说法有一点是错误的。
session是存储在硬盘上的。和内存的关系不大

那么我想再请教一点,在用户首次注册之后,服务器端的servlet我认为应该是这样子的:
1〉// 从request的参数中读取用户名和密码
2〉request.getSession(true);
3〉// 把session、用户名和密码存入数据库
4〉// 生成欢迎页面

我想知道在用户端的session id是如何从服务器端发送过去的,我觉得应该是在第4步,sinio_feng你觉得对么?

还有,sinio_feng说客户端的session id是通过get、post标头而不是cookie发送到服务器端的。我想知道这应该怎么实现?是URL重写么?

》》Session是存在硬盘上的?
因为HTTP是无状态的协议,客户端关闭浏览器不能在服务器端捕获,所以为了维持客户状态,浏览器第一次访问服务器的时候服务器会在服务器端(用Session.setAttribute(X)设置的Session上的数据是在服务器端内存里面的)创建一个Session(如果你指定这个页面是无状态的就不会,一般很少这样做),并把Session id 发送给客户端,通常是装在一个只要关闭浏览器就失效的Cookie中发送给浏览器,所以有时候客户端禁用Cookie可能就会有问题。

如果服务器端的Session不销毁的话就会越来越多,直到内存资源耗尽,所以服务器会在每次请求到达的时候更新对应session的上次活动的时间,Session长时间不活动(比如20分钟)服务器端要销毁这个session。长时间不活动就会注销这种情况的原因就是这样的。

注意到没有,如果客户端浏览器关闭,服务器端的session仍然存在直到超时为止,你新开一个浏览器又是一个新session(从一个浏览器中的超链接打开的新浏览器窗口与原来的共享session)。。在访问量大的情况下,这些session占用的内存是很可观的,将session的超时时间设置的很短可以节约内存,还有一个原则就是不要把什么东西都放到session上,不用的session变量马上remove掉。

在基于Struts应用中session id是通过一个叫jsessionid的变量用get递的,你可以在浏览器的地址栏里看到

以上这些session的维持工作都是服务器做的,通常不需要你来参与。如果要实现自动登录这样的功能才需要自己做cookie

有的网站不关闭浏览器永不超时是做了特殊处理的,实际上请求发送过去如果session超时了,他们是通过某种机制实现自动登录。比如保存cookie,也有将用户名和密码随着每次请求发送的。

简单做法是每次登录以后把用户id装在cookie里传给客户端,再把用户id放在session上。以后每次操作需要取用户id时先到session里面取,如果不存在(可能是超时或没有登录)就到随着请求发送过来的cookie里面找

注意这样做是不太安全的

》》如果不存在(可能是超时或没有登录)就到随着请求发送过来的cookie里面找

如果cookie里没有找到,那么没有登录

areyouok 说得对.

正在使用地session是在内存中地,已不再使用,但没有过期地session是存放在硬盘地指定目录地。并且正在使用地session也有缓存到硬盘上地。
理论地争论没有意义。
apache地临时目录中去找一下session文件到处都是。
其实想一下就明白,如果一个web服务器在session地处理上那么弱智会内存耗尽地话,也不用在市场地混了。

我觉得sinio_feng说的有道理。