请教各位大大,我做一个登录,利用监听器,代码如下:public class OnlineCounterListener implements javax.servlet.http.HttpSessionBindingListener{
private String user;
private String level;
private String id;
private String email;
private String postnum;
private String gold;
private String lastlogin;
private String loginnum;
private String pwd;
private OnlineCounter container=OnlineCounter.getInstance();
bll.Account accBll=new bll.Account();
public OnlineCounterListener(){
user="";
}

public void setPwd(String pwd){
this.pwd=pwd;
}

public String getPwd(){
return pwd;
}

public void setLastLogin(String login){
this.lastlogin=login;
}
public String getLastLogin(){
return lastlogin;
}

public void setLoginNum(String num){
this.loginnum=num;
}
public String getLoginNum(){
return loginnum;
} public void setID(String id){
this.id=id;
}
public String getID(){
return id;
}

public void setEmail(String Email){
this.email=Email;
}
public String getEmail(){
return email;
}

public void setPostnum(String num){
this.postnum=num;
}
public String getPostNum(){
return postnum;
}

public void setGold(String gold){
this.gold=gold;
}
public String getGold(){
return gold;
}

//设置在线人员
public void setUser(String user){
this.user=user;
}

//设置等级
public void setLevel(String level){
this.level=level;
}

//获取等级
public String getLevel(){
return level;
}

//获取在线监听
public String getUser(){
return user;
}

public void valueBound(HttpSessionBindingEvent arg0) {
// TODO 自动生成方法存根
System.out.print("Online:"+this.user+"---Level:"+level);
accBll.upLogin(this.id);
} public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO 自动生成方法存根
accBll.upLogout(id);
System.out.println("Leave:"+this.user+"---Level:"+level);
if(user!=""){
container.removeUserInfo(user);
container.removeUserInfo(level);
}
}
}web.xml设置如下:  <session-config> 
<session-timeout>10</session-timeout> 
  </session-config> 
在登录的servlet中这样写的:ArrayList als=accBll.Login(name, pwd);
if(als.size()!=0){
OnlineCounter list=OnlineCounter.getInstance();
OnlineCounterListener ut=new OnlineCounterListener();
ut.setID(als.get(0).toString());
ut.setEmail(als.get(1).toString());
ut.setPwd(als.get(2).toString());
ut.setUser(als.get(3).toString());
ut.setPostnum(als.get(4).toString());
ut.setGold(als.get(5).toString());
ut.setLastLogin(als.get(6).toString());
ut.setLoginNum(als.get(7).toString());
ut.setLevel(als.get(8).toString());
request.getSession().setAttribute("user",ut);
list.addUserInfo(ut.getUser(),ut.getLevel());出现的问题是,我关闭浏览器之后。也要满web.xml中设置的时间--10分钟,session才会失效。
如果我设置的时间长一点。就做不到精确的判断这个用户是否在线了,请问怎样才能设置成关闭浏览器session就失效呢?
不知道是不是表达清楚了~~

解决方案 »

  1.   

    把你的request.getSession()改变成request.getSession(true)就可以了
      

  2.   

    关闭浏览器不可能让session立马失效。你可以写一个js方法,当浏览器关闭时调用该js方法,在此js方法里手动注销session。
      

  3.   

    我想过用JS。但是如果我开了两个页面,然后关闭其中一个。。那不就是等于把他T掉了吗?
    这个做法我觉得不太好
      

  4.   

    我试过lgh1117的方法。发现新问题:
    就是在页面上用session.getAttribute("user")的方法得到的session是null的
    但是在我的监听器中。它还没有被排除这个是为什么呢?
      

  5.   

    尝试了一下lgh117的方法,发现新问题,在页面用session.getAttribute("user"),发现session为null,
    但是监听器的valueUnbound没有触发。这个是我什么呢?是不是我方法 用错了?
    哪个大大可以告诉一下。。谢谢了~~
      

  6.   

    把你的request.getSession()改变成request.getSession(true)就可以了
      

  7.   

    session.invalidate销毁session有Bug用户第一次登陆,可以登陆,点退出,调用session.invalidate,然后再次登陆,正常登陆,然后再点退出,这是第二次点退出第三次进行登陆,这时在登陆的时候就会报错了,java.lang.IllegalStateException: invalidate: Session already invalidated为用了session.invalidate(),session.invalidate的销毁是把这个session所带的用户彻底的销毁,这个session跟用户已经紧密联合在一起,所以就一起销毁了,这样就算换了个session,也是登陆不了的销毁session的时候绝对不能用这种形式,可以用下面的销毁来控制用户没有登陆的话不可以浏览网页和后退也不能进行操作,把上边的代码改成下边的一句就搞定:
         session.removeAttribute("sessionUserName");移除用户,但session不变,下次登陆的时候看到的sessionID还是一样的
      

  8.   

    把你的request.getSession()改变成request.getSession(true)文档里说:
    Returns the current HttpSession associated with this request or, if if there is no current session and create is true, returns a new session.
    session你可以认为是每一个IE进程对应一个会话(你新开一个IE进程就可以对应两个会话的)
    getSession都是返回当前用户的会话对象,参数的区别在于
    参数为true,则如果“当前用户的会话对象”为空(第一次访问时)则创建一个新的会话对象返回
    参数为false,则如果“当前用户的会话对象”为空,则返回null(即不自动创建会话对象)
      

  9.   

    谢谢yinyuan1987.....
    我尝试一下
      

  10.   

    http://www.blogjava.net/xiaodaoxiaodao/archive/2007/06/16/124692.html
    里面很清楚
      

  11.   

    谢谢xuhua205,但是我要的不是----一个帐号同一时间只能一个人登录 
    我想要的是即时消除session...