struts2+拦截器实现同一账户同一时间这能登陆一次

本文介绍了一种使用静态Map和拦截器来管理用户登录状态的方法,包括如何实现踢出重复登录的用户,以及如何通过session判断用户是否在线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

    1.在loginAction中定义一个静态的Map用来存放已登录用户名和用户的session.

     private static Map<String,HttpSession > m=new HashMap<String,HttpSession>();

    2.在验证完用户名密码合法后,先获得这次请求的session,

     HttpSession session = ServletActionContext.getRequest().getSession();

     然后 判断此用户时候已经登录。如何判断?写一个方法:

    public boolean hasEnter(HttpSession s,String userName,Map<String,HttpSession > m){
        boolean b=false;
        if(m.containsKey(userName)){


            b=true;
         }
      return b;
     }

     如果map中没有此用户的username,则放到map中,m.put(name, session);

     并session.setAttribute("name", name)

     如果有此用户,说明此用户正在线。那么通过HttpSession s2=(HttpSession)m.get(name)获取之前登录的session,和刚才产生的session对比sessionId是否相同session.getId().equals(s2.getId()),如果不相同则将之前的session给注销s2.invalidate(),并将新的session放到map中 m.put(name, session)。至此前一个用户就被踢了。怎样判断前一个用户被踢了呢,我之前提到再每次向map中方完后要session.setAttribute("name", name)

3.建一个拦截器拦截一般请求和ajax请求。

      拦截每一个请求是判断session.getAttribute("name")是否为空,为空则说明用户被踢或者session超时,则跳转到登录页面。不为空则放行。

 

思路很简单,我也做列子验证了一下!用拦截器的好处在于,可拦截一般请求和ajax请求,同时不必再去建session监听器,你超时我就把你拦下,没超时就放行。

 

说明一下:

IE8要使多个窗口不共用一个session,要在IE属性--目标-- 最后面加 -nomerge,如   nternet Explorer\iexplore.exe" -nomerge

火狐这点不如IE,所以火狐的窗口都用的是一个session.

 

ok!回家吃饭···

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值