天天看点

shiro AccessControlFilter运行步骤介绍执行流程总结

shiro AccessControlFilter运行步骤

  • 介绍
  • 执行流程
  • 总结
    • 其他相关链接

介绍

任何筛选器的超类,用于控制对资源的访问,并可能将用户重定向到登录页面 如果它们未经身份验证。
此超类提供方法saveRequestAndRedirectToLogin(javax.servlet.ServletRequest,javax.servlet.ServletResponse),许多子类将其用作用户未经身份验证时的行为
           

AccessControlFilter提供了访问控制的基础功能;比如是否允许访问/当访问拒绝时如何处理等:

shiro AccessControlFilter运行步骤介绍执行流程总结

isAccessAllowed:表示是否允许访问;mappedValue就是[urls]配置中拦截器参数部分,如果允许访问返回true,否则false;

onAccessDenied:表示当访问拒绝时是否已经处理了;如果返回true表示需要继续处理;如果返回false表示该拦截器实例已经处理了,将直接返回即可。

onPreHandle会自动调用这两个方法决定是否继续处理:

shiro AccessControlFilter运行步骤介绍执行流程总结

可以发现他是调用的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