您的位置:首页 > 运维架构 > Tomcat

javaWeb不允许两个客户端同时使用一个账号登录系统(支持多个tomcat)

2018-03-27 18:38 507 查看
(本代码需要在redis环境下才能实现)
思路:
    1.在登录的时候监听登录的session,把sessionid和用户表示存在redis。(key:用户表示 ;value:sessionid)。

       session监听:实现HttpSessionListener,HttpSessionAttributeListener。
    2.写一个过滤器,过滤请求的session。
代码:
    1.session监听
    public void attributeAdded(HttpSessionBindingEvent event) {
        // TODO Auto-generated method stub
        String name = event.getName();
        log.info("当前session名称:" + name);
        //判断当前是不是登录
        if(name.equals("LoginSession")){
            log.info(" ----------登录session监听------strat--------------");
            //根据name来获取登录的session
        
            String sessionid = event.getSession().getId();  //获取当前登录的sessionid

             /**
            这里你要连接你的redis。具体代码百度一下

            */
            //把用户表示和sessionid存入缓存,并且给一个时间 为了防止直接关闭浏览器导致session不过期。一直存在于缓存。

            JedisCluster cluster = new JedisCluster(nodes);
            //判断缓存里面有没有sessionid
            cluster.set(uid, sessionid);
            cluster.expire(uid, 300);
            log.info(loginUser.getNickname()+"登录中!");
            log.info(" ----------登录session监听------end--------------");
        }

    }

2.过滤器
public class SessionFilter implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @SuppressWarnings("null")
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
            FilterChain nextFilter) throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest request = (HttpServletRequest) servletRequest;   
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpSession session = (HttpSession) request.getSession();

        if(request.isRequestedSessionIdValid())
        //获取当前请求的sessionid

            String sessionid = session.getId();
            LoginSession login = (LoginSession) request.getSession().getAttribute("LoginSession");
            if(login != null){
                String uid = login.getUid();
                //从缓存中取得当前uid的sessionid
            
                JedisCluster cluster = new JedisCluster(nodes);
                String redis_sessionid = cluster.get(uid);
                cluster.expire(uid, 300);//redis失效时间刷新
                //判断请求session是不是被另外一个客户登录

                if(redis_sessionid != null){

                    //如果当前的sessionId和redis的sessionid不一致,那是因为有人登陆了这个账号

                    if(!redis_sessionid.equals(sessionid)){
                        session.invalidate();//让当前请求的session失效
                        response.setContentType("text/html;charset=utf-8");
                          PrintWriter out = response.getWriter();
                          out.println("<script language='JavaScript' type='text/JavaScript'>");
                          out.println("alert('您的账号在异地登录,已被迫下线!')");
                          out.println("history.back();");
                          out.println("</script>");
                          out.close();
                          response.sendRedirect("/index.jsp");
                        return;
                    }
                }
            }
        }else{
            request.getSession().invalidate();
        }
        nextFilter.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  登录 session 过滤器
相关文章推荐