AbstractFilter,抽象过滤器
它实现Filter、继承ServletContextSupport。
它主要实现了init(FilterConfig filterConfig)
方法,此方法主要设置了本类的FilterConfig filterConfig
和ServletContextSupport
的ServletContext servletContext
。
ServletContextSupport,ServletContext的基础支持类
此类主要提供设置参数、获取ServletContext、操作Attribute等方法。
NameableFilter,命名过滤器
此类主要用于给Fitler命名,如果没有设置命名,则用FilterName。
OncePerRequestFilter,单次请求过滤器
设置Filter是否生效
此类有一个属性boolean enabled = true
,还暴露了方法访问、操作此属性,此属性用于控制此Filter是否生效:
一个请求只执行一次此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
方法,可以看到prepareServletRequest
和prepareServletResponse
方法,一路跟踪进去可见ShiroHttpServletRequest,它继承HttpServletRequestWrapper,这是典型的装饰器模式。