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

思路:

    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!回家吃饭···

 

你可能感兴趣的:(struts2)