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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值