博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Shiro】小读Shiro Filter(未完待续)
阅读量:6949 次
发布时间:2019-06-27

本文共 2541 字,大约阅读时间需要 8 分钟。

类继承结构图

看不明白此图不要紧,后面慢慢提到此图的类:

463931-20180823002339819-868305686.png

AbstractFilter,抽象过滤器

它实现Filter、继承ServletContextSupport。

它主要实现了init(FilterConfig filterConfig)方法,此方法主要设置了本类的FilterConfig filterConfigServletContextSupportServletContext servletContext

ServletContextSupport,ServletContext的基础支持类

此类主要提供设置参数、获取ServletContext、操作Attribute等方法。

463931-20180820232721510-1881180728.png

NameableFilter,命名过滤器

此类主要用于给Fitler命名,如果没有设置命名,则用FilterName。

OncePerRequestFilter,单次请求过滤器

设置Filter是否生效

此类有一个属性boolean enabled = true,还暴露了方法访问、操作此属性,此属性用于控制此Filter是否生效:

463931-20180820233506604-1369809755.png

一个请求只执行一次此Filter

我们看doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)方法。

此方法的alreadyFilteredAttributeName变量根据Filter名称组成,可唯一标识一个Filter,可见getAlreadyFilteredAttributeName方法。
通过Attribute标识此请求是否已执行,通过request.getAttribute方法判断是否存在该属性,最后在处理完过滤器后,finally块通过request.removeAttribute方法删除该属性。
向后暴露doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain)抽象方法。

AbstractShiroFilter,抽象Shiro过滤器

此类的入口为doFilterInternal方法。

ShiroHttpServletRequest,Shiro的包装请求类

doFilterInternal方法,可以看到prepareServletRequestprepareServletResponse方法,一路跟踪进去可见ShiroHttpServletRequest,它继承HttpServletRequestWrapper,这是典型的装饰器模式。

ShiroFilter,Shiro过滤器

此类只有一个方法,就是init方法。

此方法的调用关系如下:
463931-20180823002736556-773110658.png

另一个类继承结构图

463931-20180823002935269-1092421935.png

AdviceFilter,类似切面的过滤器

看此类,会发现与AOP切面的风格很相似,相当于执行过滤器链的切面。主要逻辑体现在doFilterInternal方法中。

  • preHandle,前置处理,如果返回true,说明执行过滤器链,否则不执行,中断执行链。从此变量命名就可知:boolean continueChain = preHandle(request, response);
  • postHandle,后置处理。执行过滤器链后,会执行此方法
  • afterCompletion,完成时处理。在执行完过滤器后,无论正常返回或抛出异常,都会执行此方法,主要用于资源回收。(注:此方法的调用在cleanup方法中)

PathMatchingFilter

属性pathMatcher,是Ant风格的路径匹配器:PatternMatcher pathMatcher = new AntPathMatcher(),比如?表示一个字符,*表示0个或多个字符,**表示0个或多个目录。

方法pathsMatch,会获取请求的URI,然后使用路径匹配器去判断是否匹配。
方法preHandle是前置处理的方法,会先判断appliedPaths是否有配置的路径通配符,如果没有,则通过;然后遍历appliedPaths调用pathsMatch匹配当前请求路径。如果匹配,调用isFilterChainContinued方法。
方法isFilterChainContinued,如果此Filter有效的,则调onPreHandle决定是否继续Filter链;如此Filter无效,返回true,继续Filter链。
方法onPreHandle,默认返回true,即继续Filter链。

AccessControlFilter,访问控制过滤器

方法onPreHandle,调用isAccessAllowed方法和onAccessDenied方法确定是否继续执行。返回true则继续执行filter链,返回false则不执行。

方法isAccessAllowed,是否允许访问
方法onAccessDenied,当被方法isAccessAllowed拒绝访问时,调用此方法,此方法为处理措施,处理完毕,返回true则继续执行filter链,返回false则不执行。处理措施,比如尝试登陆。

AuthenticationFilter,认证过滤器

方法isAccessAllowed,判断是否已认证

跳转到成功页面或拦截前想前往的页面

AuthenticatingFilter,验证过滤器

方法isAccessAllowed,用AuthenticationFilter的认证判断,如果未认证,判断此请求是否登录请求、允许的请求

BasicHttpAuthenticationFilter,基础认证过滤器

方法isAccessAllowed,首先判断请求URL的请求方法是否需要认证,然后再调用父类的isAccessAllowed判断是否认证

FormAuthenticationFilter,表单认证过滤器

方法onAccessDenied,首先判断是否登录请求,如果为否,则保存请求并跳到登录页。如有为是,则判断是否POST HTTP请求,如果是则执行登录

转载地址:http://qqkil.baihongyu.com/

你可能感兴趣的文章
linux命令总结
查看>>
[激励机制]浅谈内部竞争——如何让你的员工玩命干活?
查看>>
把一个控制器的view添加到另外一个控制器
查看>>
pc端和移动端下拉刷新
查看>>
Maven详解之聚合与继承
查看>>
Spark(二)CentOS7.5之Spark2.3.1HA安装
查看>>
内存池和tcmalloc的性能比较
查看>>
大白话5分钟带你走进人工智能-第二十三节决策树系列之特点和数学表达形式(2)...
查看>>
GOF设计模式汇总
查看>>
Ehcache整合spring配置,配置springMVC缓存
查看>>
华为敏捷/DevOps实践:如何开好站立会议
查看>>
NDN与TCP/IP
查看>>
Java MVC设计模式
查看>>
android Studio快捷键
查看>>
js的 new Date()日期格式化显示以及js获取时间戳
查看>>
区块链中的节点是什么?
查看>>
要不要跟风iPad
查看>>
Java》uSocket =
查看>>
练习4.4 萨提亚冰山理论应用
查看>>
模块与包
查看>>