如何监听在客户端关闭浏览器时,销毁Session?

时间:2022-01-19 13:17:06
主要是为了防止同一用户名重复登陆,用户登录后通过session.SetAttribute保存,同时把用户对象通过sesssion.getServletContext().setAttribute添加到全局session列表中,现在如果用户浏览器关闭后,单个session确实是销毁了,但是全局的session列表的对象还存在,怎样才能监听客户端关闭浏览器后,在全局session列表中移除某个用户session对象呢?
   

3 个解决方案

#1


老掉牙的问题了,前几年这里就讨论过了,不过也没啥结果。

这种问题是防不胜防的。

用户可以不关浏览器直接关机、拔电或者断电。

#2


还可以,拔网线,甚至可能突然发生地震。你防不胜防。

防止重复登陆,一个办法就是把在数据库/内存中记录 用户ID-sessionId的映射。登录是更新这个映射,filter检查,一旦有问题就session.invalidate()。不过,个人感觉,很多情况下限制单一用户登录,其实没什么大的意义。

#3


给你一个统计在线人员的类吧;

package net.risesoft.integration.online;

 

import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionBindingListener;

 

import net.risesoft.commons.RiseUser;

import net.risesoft.commons.SessionConst;

 

public class OnlineUsersHttpSessionBindingListener implements

        HttpSessionBindingListener {

 

    /**

     * 对象实例(即OnlineUsersHttpSessionBindingListener的实例)作为一个属性被设置到session的

     * 时候,会调用本方法,这种情况一般发生在点击登录按钮以后的处理过程中设置

     *

     * @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)

     */

    public void valueBound(HttpSessionBindingEvent event) {

        //现在暂时不需要额外处理,你可以在这里记录日志等

        RiseUser user = (RiseUser)event.getSession().getAttribute(SessionConst.USER); 

        OnlineUsers.addUser(user);

    }

 

    /**

     * 当Session超时,或本实例被从session中移除的时候被调用,这种情况一般发生在注销方法的处理过程中

     *

     * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)

     */

    public void valueUnbound(HttpSessionBindingEvent event) {

    RiseUser user = (RiseUser) event.getSession().getAttribute(

              SessionConst.USER);

       OnlineUsers.removeUser(user);

    }

 

#1


老掉牙的问题了,前几年这里就讨论过了,不过也没啥结果。

这种问题是防不胜防的。

用户可以不关浏览器直接关机、拔电或者断电。

#2


还可以,拔网线,甚至可能突然发生地震。你防不胜防。

防止重复登陆,一个办法就是把在数据库/内存中记录 用户ID-sessionId的映射。登录是更新这个映射,filter检查,一旦有问题就session.invalidate()。不过,个人感觉,很多情况下限制单一用户登录,其实没什么大的意义。

#3


给你一个统计在线人员的类吧;

package net.risesoft.integration.online;

 

import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionBindingListener;

 

import net.risesoft.commons.RiseUser;

import net.risesoft.commons.SessionConst;

 

public class OnlineUsersHttpSessionBindingListener implements

        HttpSessionBindingListener {

 

    /**

     * 对象实例(即OnlineUsersHttpSessionBindingListener的实例)作为一个属性被设置到session的

     * 时候,会调用本方法,这种情况一般发生在点击登录按钮以后的处理过程中设置

     *

     * @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)

     */

    public void valueBound(HttpSessionBindingEvent event) {

        //现在暂时不需要额外处理,你可以在这里记录日志等

        RiseUser user = (RiseUser)event.getSession().getAttribute(SessionConst.USER); 

        OnlineUsers.addUser(user);

    }

 

    /**

     * 当Session超时,或本实例被从session中移除的时候被调用,这种情况一般发生在注销方法的处理过程中

     *

     * @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)

     */

    public void valueUnbound(HttpSessionBindingEvent event) {

    RiseUser user = (RiseUser) event.getSession().getAttribute(

              SessionConst.USER);

       OnlineUsers.removeUser(user);

    }