介绍
任何筛选器的超类,用于控制对资源的访问,并可能将用户重定向到登录页面 如果它们未经身份验证。
此超类提供方法saveRequestAndRedirectToLogin(javax.servlet.ServletRequest,javax.servlet.ServletResponse),许多子类将其用作用户未经身份验证时的行为
AccessControlFilter提供了访问控制的基础功能;比如是否允许访问/当访问拒绝时如何处理等:
isAccessAllowed:表示是否允许访问;mappedValue就是[urls]配置中拦截器参数部分,如果允许访问返回true,否则false;
onAccessDenied:表示当访问拒绝时是否已经处理了;如果返回true表示需要继续处理;如果返回false表示该拦截器实例已经处理了,将直接返回即可。
onPreHandle会自动调用这两个方法决定是否继续处理:
可以发现他是调用的isAccessAllowed方法和onAccessDenied方法,只要两者有一个可以就可以了,从名字中我们也可以理解,他的逻辑是这样:先调用isAccessAllowed,如果返回的是true,则直接放行执行后面的filter和servlet,如果返回的是false,则继续执行后面的onAccessDenied方法,如果后面返回的是true则也可以有权限继续执行后面的filter和servelt。
只有两个函数都返回false才会阻止后面的filter和servlet的执行。
执行流程
当我们继承AccessControlFilter 类,isAccessAllowed方法在这个类中都是抽象的,依靠实现类实现。onAccessDenied方法不是抽象的,但是调用了另一个抽象的方法:
org.apache.shiro.web.filter.AccessControlFilter.onAccessDenied(ServletRequest, ServletResponse)
这个方法忽略了之前配置的param参数。
当请求进来之后,率先onPreHandle()方法,前置方法里面 我们可以进行日志操作 验证码 等等,然后调用实现类的isAccessAllowed() 方法,如果返回false,则会接着调用onAccessDenied()。
总结
shiro 提供的方法,可以利用其特性 进行类似 验证码校验,前置校验等等
路漫漫其修远兮,吾将上下而求索
希望可以帮助到你
其他相关链接
shiro提供的filter-AccessControlFilter
【shiro】AccessControlFilter