ShiroFilter拦截器是整个Shiro的入口,用于拦截需要安全控制的请求并进行处理。
shiro封装了很多不同用途的拦截器,这里只介绍几个比较常用的拦截器,更详细介绍可以参考博文
《第八章拦截器机制——跟我学Shiro》:http://jinnianshilongnian.iteye.com/blog/2025656
登录拦截器(FormAuthenticationFilter)
由于此拦截器经常需要继承并重写里面的方法,来扩展自己的登录拦截规则,所以会进行详细介绍。
等录拦截器主要有两个作用
-
拦截登录表单提交的路径(在拦截器工厂中配置)。
创建登录认证所需要的Token令牌,并进入登录认证流程。
-
拦截要求登录才可以访问的路径时(在拦截规则中配置)。
如果已经登录则直接进入到要访问路径,如果未登录则访问被拒绝并跳转到登录页。
方法介绍
createToken( ):
此方法用于创建登录认证令牌,令牌内存储了登录认证时所需的数据。当我们需要扩展shiro原有令牌的时候会重写此方法,将扩展的令牌字段存入令牌。最典型的例子就是在令牌中增加了验证码字段。(令牌会在其他章节另作介绍)
/**
* 创建Token
*/
@Override
protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
String username = getUsername(request);//获取用户名 表单name:username
String password = getPassword(request);//获取密码 表单name:password
boolean rememberMe = isRememberMe(request);//获取是否记住我 表单name:rememberMe
String captchaId = WebUtils.getCleanParam(request, "captchaId");//获取验证码id
String captcha = WebUtils.getCleanParam(request, "captcha");//获取用户输入的验证码字符
return new CaptchaAuthenticationToken(username, password,captchaId, captcha, rememberMe);//存入自己定义的包含验证码的Token
}
onLoginSuccess( ):
登录认证成功后的行为。此方法只有在进行登录认证成功后访问一次。之后再访问页面时不会调用此方法。
onAccessDenied( ):
访问被拒绝后的行为。在拦截规则中指定需要登陆后才能访问的路径,如果没有登录则认为访问被拒绝。
此方法处理访问被拒绝后的逻辑,最常见的就是对于ajax访问拒绝的特殊处理。
此方法处理完成后,默认行为会跳转到登录页(可以在拦截器工厂中配置 或 setLoginUrl方法设置登陆页)。
这里要注意如果是登录操作,拦截器会先拦截并判定为拒绝访问进入到此方法,然后再去进行创建Token和登录认证等操作。
setLoginUrl( ):
设置登陆页路径。默认/login.jsp,可以在拦截器工厂中配置 或 使用此方法重置。
访问被拒绝时我们可以使用此方法返回到其他登陆页面,而不是之前的登录页。
@Override