为了让后登陆的人,挤掉先登陆的人。在登陆成功时,记录该账号对应的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;
}