类继承结构图

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

AbstractFilter,抽象过滤器

它实现Filter、继承ServletContextSupport。
它主要实现了init(FilterConfig filterConfig)方法,此方法主要设置了本类的FilterConfig filterConfigServletContextSupportServletContext 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方法,可以看到prepareServletRequestprepareServletResponse方法,一路跟踪进去可见ShiroHttpServletRequest,它继承HttpServletRequestWrapper,这是典型的装饰器模式。

ShiroFilter,Shiro过滤器

此类只有一个方法,就是init方法。
此方法的调用关系如下:

另一个类继承结构图

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请求,如果是则执行登录

【Shiro】小读Shiro Filter的更多相关文章

  1. 【Shiro】Apache Shiro架构之集成web

    Shiro系列文章: [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之权限认证(Authorization) [Shi ...

  2. shiro开发,shiro的环境配置(基于spring+springMVC+redis)

    特别感谢lhacker分享的文章,对我帮助很大 http://www.aiuxian.com/article/p-1913280.html 基本的知识就不在这里讲了,在实战中体会shiro的整体设计理 ...

  3. Shiro入门之一 -------- Shiro权限认证与授权

    一  将Shirojar包导入web项目 二 在web.xml中配置shiro代理过滤器 注意: 该过滤器需要配置在struts2过滤器之前 <!-- 配置Shiro的代理过滤器 -->  ...

  4. [shiro] - 怎样使用shiro?

    shiro是什么? Shiro是apache旗下的一个开源框架, 它将软件系统的安全认证相关的功能抽取出来, 实现用户身份认证, 权限授权, 加密, 会话管理等功能, 组成一个通用的安全认证框架. 为 ...

  5. Apache Shiro学习-2-Apache Shiro Web Support

     Apache Shiro Web Support  1. 配置 将 Shiro 整合到 Web 应用中的最简单方式是在 web.xml 的 Servlet ContextListener 和 Fil ...

  6. 细说shiro之一:shiro简介

    官网:https://shiro.apache.org/ 一. Shiro是什么Shiro是一个Java平台的开源权限框架,用于认证和访问授权.具体来说,满足对如下元素的支持: 用户,角色,权限(仅仅 ...

  7. 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

    原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...

  8. 【Shiro】Apache Shiro架构之自定义realm

    [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之权限认证(Authorization) [Shiro]Apache S ...

  9. 【Shiro】Apache Shiro架构之权限认证(Authorization)

    Shiro系列文章: [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shir ...

随机推荐

  1. Idea创建一个springboot多模块项目

    一.创建空Maven项目 二.左边选择maven,右边可以什么不选,直接next: 三.填写artifactId,点击next直到finish 四.finish后,idea会生成如下结果模块,删除sr ...

  2. linux 文件打包压缩成.tar.gz

    tar czvf beian.drcluod.cn.20180509.tar.gz ./beian.drcloud.cn/*

  3. renren-vue 基于最新node10.8、npm6.2 在win7 x64系统 成功初始化启动

    renren-vue 基于最新node.npm初始化之路 renren-fast 是一个轻量级的 Spring Boot 快速开发平台,能快速开发项目并交付[接私活利器] 完善的 XSS 防范及脚本过 ...

  4. 谈谈canvas的性能优化(主要讲缓存问题)

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! canvas玩多了后,就会自动的要开始考虑性能问题了.怎么优化canvas的动画呢? [使用缓存] 使用缓存也就是用离屏canvas进行预 ...

  5. [BZOJ1899][ZJOI2004]Lunch 午餐 (DP)

    比较水的DP 但是比较难想 整体思路还是很好理解的 在洛谷的题解里有一个一维的 > 什么时候去看一下 下面发我的代码 #include<bits/stdc++.h> #define ...

  6. Java 基础 在Java中需要使用内存的组件

    Java程序启动后作为一个进程运行在操作系统中,那么这个进程有哪些部分需要分配内存? 1 Java堆 Java堆用于存储Java对象,堆的大小在JVM启动时向操作系统一次性申请完成,通过-Xmx和-X ...

  7. rem自适应手机端布局

    通过js根据屏幕设备尺寸的大小,改变根元素的值: <script> var html = document.querySelector("html"); var rem ...

  8. 使用iscroll,无法正常滑动的原因

    iscroll的dom元素的结构是固定的,swiper是容器,scroll是需要滚动的容器,list是滚动的内容 <div class="swiper"> <di ...

  9. ionic2 处理android硬件返回按钮

    问题 注册安卓硬件返回按钮事件是必须的,因为用户不小心点击了返回按钮就退出app体验很不好,所以有几种方法: 1.实现按返回键最小化应用(最小化应用需要装cordova-plugin-appminim ...

  10. 180400之pycharm快捷方式汇总

    1.Pycharm中快捷键大全,遇到一个更新一个 撤销与反撤销:Ctrl + z,Ctrl + Shift + z 缩进.不缩进:Tab.Shift + tab 运行:Shift + F10 批量注释 ...