一只菜鸡仔 2021-07-19 09:57 采纳率: 0%
浏览 36

这个代码怎么改成第一个人用账号A登录上了,第二个人用账号A登录上也可以登上,并且第一个人要强制下线

这个是controller层

// 用户登录
    @RequestMapping("/login")
    public void login(User puser, HttpServletResponse response,
            HttpServletRequest hr,String code) throws Exception {

        //System.out.println(MD5.GetMD5Code(MD5.GetMD5Code(puser.getPassword())));
        puser.setPassword(MD5.GetMD5Code(MD5.GetMD5Code(puser.getPassword())));
        rs = userService.login(hr.getSession(), puser,hr,code);
        result(rs, response);
    }

这个是service层

@Override
    public String login(HttpSession session,User puser,HttpServletRequest request,String code) {

        //用户登录
        Map<String,Object> p1 = new HashMap<String,Object>();
        Map<String,Object> p = userMapper.login(puser);

        String sessionCode = session.getAttribute("code").toString();
        //防止绕过验证码
        session.removeAttribute("code");
        if (sessionCode == null) {
            p1.put("flag", 0);
            p1.put("userState", 2);
            return response(p1);
        }

        if (!(code.toLowerCase()).equals(sessionCode.toLowerCase())) {
            p1.put("flag",0);
            p1.put("userState", 2);
            return response(p1);
        }
        if(p==null || p.get("authIds")==null||TextUtil.getInt(p.get("userState"))==0){
            p1.put("flag",0);
            if(p!=null&&p.get("userState")!=null) {
                p1.put("userState", TextUtil.getInt(p.get("userState")));
            }
            else {
                p1.put("userState", 1);
            }
            return response(p1);
        }
        Map<String,Object> params=new HashMap<String,Object>();
        params.put("userId", p.get("id"));
        params.put("OS", SystemUtils.getRequestSystemInfo(request));
        params.put("browser", SystemUtils.getRequestBrowserInfo(request));
        params.put("type", 1);
        params.put("loginDate", new Date());
        userLoginLogMapper.insert(params);


        Map login = (HashMap)(request.getSession().getServletContext().getAttribute("LOGIN"));
        if(login==null){
            login=new HashMap();
            login.put(p.get("id")+"", request.getSession().getId());
            request.getSession().getServletContext().setAttribute("LOGIN", login);
        }else{
            if(!login.containsKey(p.get("id")+"")){
                login.put(p.get("id")+"", request.getSession().getId());
                request.getSession().getServletContext().setAttribute("LOGIN", login);
            }
        }
      
        if(login.containsKey( p.get("id")+"")&&!(""+login.get(p.get("id")+"")).equals(request.getSession().getId()+"")){
        //2代表用户已在线
            p1.put("flag",2);
        }else{
        //1代表登录成功
            p1.put("flag",1);
        }

        List r = new ArrayList();
        String[] pis = (p.get("authIds")+"").split(",");
        for (int i = 0; i < pis.length; i++) {
            r.add(pis[i]);
        }
        session.setAttribute("qx",  (p.get("authIds")+""));
        session.setAttribute(SystemContant.PRIVILEGES, r);
        session.setAttribute("userName", p.get("userName")+"");
        session.setAttribute("uid",  p.get("id")+"");
        session.setAttribute("roleName",  p.get("roleName")+"");
        session.setAttribute("realName",  p.get("realName")+"");
        return response(p1);
    }

这个是过滤器

@Override
    public void doFilter(ServletRequest servletRequest,
            ServletResponse servletResponse, FilterChain filterChain)
                    throws IOException, ServletException {
        // TODO Auto-generated method stub

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpSession session = request.getSession();


        // 获得用户请求的URI
        String path = request.getRequestURI();
        String contextPath = request.getContextPath();
        String url = path.substring(contextPath.length());
        // System.out.println("=================CheckLoginFilter url=" + path);
        /*
         * Person person =SessionUtils.getPerson(request);
         * 
         * if (person == null) {
         * response.sendRedirect(contextPath+"/person.do?method=tologin");
         * return;
         * }
         * if (person.getId()!=null&&person.getPassword()!=null) {
         * filterChain.doFilter(servletRequest, servletResponse);
         * return;
         * }
         */
        String indexPath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/login.jsp";
        // System.out.println("=================CheckLoginFilter indexPath=" + indexPath);
        if (path.indexOf(".jsp") > 0 & path.indexOf("login") == -1) {
            // 是否登陆
            String uid = request.getSession().getAttribute("uid") + "";
            if (uid == null || "".equals(uid) || "null".equals(uid)) {
                response.sendRedirect(indexPath);
            }
            else {
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
        else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }

这个是前端jsp的登录回调

//登录回调
function getStaff4loginCallBack(data) {
       debugger;
    submit = false;
   if(!data)
    {
        alert("用户已在线,请先退出之前用户!");
        changeImg();
        submit = false;
        return;
    }
    if (data.flag == 0) {
    
        if(data.userState==2){
              alert("验证码错误!");
        }else{
            alert("登录失败,请检查用户名和密码是否有误!");
        }    
        changeImg();
        submit = false;
        return;
    }
    else if (data.flag == 2) {
        alert("用户已在线,请先退出之前用户!");
        changeImg();
        submit = false;
        return;
    }
    else {    
        //指向首页
        window.location='main.jsp';
    }
}

他原本这个代码做的是第一个人用账号A登录的时候登录上了,第二个人同样用账号A来登录的时候,就登不上会提示下线。现在要改成第一个人用账号A登录上了,可以登上,第二个人用账号A登录上也可以登上,但是第一个人要下线。应该怎么改?

  • 写回答

4条回答 默认 最新

  • CSDN专家-文盲老顾 2021-07-19 14:39
    关注

    用数据库解决,登录成功后,生成一个token,将token保存到cookie或session里,同时保存到数据库里(可以放到user信息里,也可以放到登录日志里),每次访问验证token和用户名,如果一致则通过,否则则踢掉

    评论

报告相同问题?

问题事件

  • 创建了问题 7月19日

悬赏问题

  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥50 汇编语言除法溢出问题
  • ¥65 C++实现删除N个数据列表共有的元素
  • ¥15 Visual Studio问题
  • ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波