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