版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27273089/article/details/63684557 </div>
<div id="content_views" class="markdown_views">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
<p>问题:第一次使用shiro时,做好登录功能(包括用户检验等),并且登录成功以后,为了方便直接修改浏览器的地址返回到登录页面(即没有注销登录),当输入另一个用户的账号和密码后跳转到登录成功页面还是显示先前登录的用户信息</p>
原因:一步步debug下去以后就很容易发现问题了,登录验证前会经过AuthenticationFilter类的isAccessAllowed方法,如果该方法返回true的话就不会执行下面的登陆验证了,该方法如下:
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
//返回subject是否已经登陆验证通过了,因为没有logout,所以返回true
return subject.isAuthenticated();
}
- 1
- 2
- 3
- 4
- 5
知道这个以后解决方法就很简单了,只要重写该类或该子类的的isAccessAllowed方法就可以了,这里我重写了子类FormAuthenticationFilter
public class MyFormAuthenticationFilter extends FormAuthenticationFilter
{
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
{
if (isLoginRequest(request, response))
{
if (isLoginSubmission(request, response))
{
//本次用户登陆账号
String account = this.getUsername(request);
Subject subject = this.getSubject(request, response);
//之前登陆的用户
ActiveUser user = (ActiveUser) subject.getPrincipal();
//如果两次登陆的用户不一样,则先退出之前登陆的用户
if (account != null && user != null && !account.equals(user.getAccount()))
{
subject.logout();
}
}
}
return super.isAccessAllowed(request, response, mappedValue);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
最后再配置文件中注册该类的解决了!
转载请附上地址:http://blog.csdn.net/qq_27273089/article/details/63684557