shiro框架源码解析与改造(十)---关于登陆的一些问题

为了让后登陆的人,挤掉先登陆的人。在登陆成功时,记录该账号对应的sessionID,那么在后来验证是否登陆时,就可以取出这个值做比较。

 protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) {
        Session session=SecurityUtils.getSubject().getSession();
        if (session!=null){
            Serializable id= session.getId();
            jedisPoolManager.hset(UNIQUE_ACCOUNT_KEY,token.getPrincipal().toString(),id.toString());
        }
        return super.onLoginSuccess(token, subject, request, response);
    }

这是挤掉一个账号时做的处理,给予提示信息。

 @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        Subject subject = SecurityUtils.getSubject();
        if (subject.isAuthenticated()) {
            Map<String, String> kv = new HashMap<>();
            kv.put("error", "您的账号在另一个地方登陆,您已下线。");
            this.saveRequest(request);
            WebUtils.issueRedirect(request, response, this.getFailedUrl(), kv, true);
            subject.logout();
        }
        return false;
    }

登陆失败时,做以下处理。因为默认登陆失败时使用的重定向,所以这里将错误信息保存在session中,再将客户重定向到登陆页面时,就可以将session中的提示信息显示给客户。

@Override
    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
        try {
            Session session=SecurityUtils.getSubject().getSession();
            if (session!=null){
                session.setAttribute("error","登陆失败,用户名账号或密码错误");
            }
            WebUtils.redirectToSavedRequest(request, response, this.getFailedUrl());
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        return false;
    }

猜你喜欢

转载自blog.csdn.net/ljz2016/article/details/81565031
今日推荐