最近写了一个小的web项目,要实现用户不能重复登录的功能。我是给用户表添加了一个用来标记用户登录状态的字段(1、未登录 2、已登录)。每次用户登录时候会在action中先判断该用户的登录状态,如果是1则正常登录。否则提示该用户已登录,不能重复登录。当用户点击注销时候就会走action修改该用户的登录状态,然后跳转到登录页面。现在遇到一个问题就是:如果用户没有点击注销而是直接关闭浏览器,或者刷新浏览器就不能正常修改该用户的登录状态。也就是该用户下次就不能登录了。
   我是个菜鸟,现在遇到这个问题不知道该怎么处理。求帮助。。哪位大侠帮忙指点一下。万分感谢

解决方案 »

  1.   

    需要考虑两点 :
    1、用户主动关闭浏览器
    可以使用
      window.onbeforeunload=function (e){
      if( window.event.clientY < 0 || window.event.altKey){
           //alert("你关闭了浏览器");
      $.ajax({
    url:"${ctx}/system/user/user!logout.action",
    type:"post",
    success:function(){}
      });
      }else{
           //alert("你正在刷新页面");
      }
      }2、session自动到期可以写一个SessionListener 监听器  实现HttpSessionListener的sessionDestroyed()
    session销毁后重置你的字段。。
      

  2.   

    好像有个监听session内容变化的监听器HttpSessionAttributeListener,可以百度看一下,可以实现单态登陆
      

  3.   

    如果用户没有点击注销而是直接关闭浏览器,或者刷新浏览器就不能正常修改该用户的登录状态。
    1. 自动登录:浏览器端用Cookie保存用户的登录信息,如用户名,密码。
    2. 登录状态保存:
        a. 用Session在服务器端保存用户已登录的状态。
        b. 用数据记录登录状态也可以,下次登录的时候,看看上次注销或者登录的时间(处理你正好遇到的这个问题)就可以了。但是浏览器端需要定时的发一个请求更新登录状态。
      

  4.   

    总的来说,如果登陆了就不让用户登陆这种来说可能会出现一些问题,因为在一些情况下你无法得到用户退出系统的事件。
    1.提示用户,某某用户正在登陆使用。
    2.session失效的时候注销用户的登陆
      

  5.   

    session记录你的用户登录状态,失效时改变状态。这个是否登录记录在数据库中,应该是有点问题的。你可以考虑下不这么做。
      

  6.   

    登陆状态不能存于数据库中,而且,不能限制用户重复登陆。要实现这个只有像WEBQQ的做法,当有重复登陆时就强制先登陆的下线(删除先登陆的SESSION)。
      

  7.   

    为什么要在db保存登录状态呢?
    ps.非要这么做,1楼可行
      

  8.   

    session,cookie机制呀,建议楼主去看看
      

  9.   

    利用利用利用利用Struts同步令牌同步令牌同步令牌同步令牌((((Token))))机制来解决机制来解决机制来解决机制来解决Web应用中的重复提交问题应用中的重复提交问题应用中的重复提交问题应用中的重复提交问题。该方法的基本原该方法的基本原该方法的基本原该方法的基本原理是理是理是理是::::服务器端在处理到达的服务器端在处理到达的服务器端在处理到达的服务器端在处理到达的request之前之前之前之前,,,,会将会将会将会将request中的中的中的中的Token值与保存在当前用值与保存在当前用值与保存在当前用值与保存在当前用户户户户session中的令牌值进行比较中的令牌值进行比较中的令牌值进行比较中的令牌值进行比较,,,,看是否匹配看是否匹配看是否匹配看是否匹配。在处理完该在处理完该在处理完该在处理完该request后后后后,,,,且在且在且在且在response发送给客户端之前发送给客户端之前发送给客户端之前发送给客户端之前,,,,将会产生一个新的将会产生一个新的将会产生一个新的将会产生一个新的 Token,,,,该该该该Token除传给客户端以外除传给客户端以外除传给客户端以外除传给客户端以外,,,,也会将用户也会将用户也会将用户也会将用户session中保存的旧的中保存的旧的中保存的旧的中保存的旧的Token进行替换进行替换进行替换进行替换。这样这样这样这样,,,,如果用户会退到刚才的提交页面并再次提交的如果用户会退到刚才的提交页面并再次提交的如果用户会退到刚才的提交页面并再次提交的如果用户会退到刚才的提交页面并再次提交的话话话话,,,,客户端传过来的客户端传过来的客户端传过来的客户端传过来的Token值和服务器端的不一致值和服务器端的不一致值和服务器端的不一致值和服务器端的不一致,,,,从而有效地防止了重复提交地发生从而有效地防止了重复提交地发生从而有效地防止了重复提交地发生从而有效地防止了重复提交地发生。