【Shiro】小读Shiro Filter
类继承结构图
看不明白此图不要紧,后面慢慢提到此图的类:
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,这是典型的装饰器模式。
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的更多相关文章
- 【Shiro】Apache Shiro架构之集成web
Shiro系列文章: [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之权限认证(Authorization) [Shi ...
- shiro开发,shiro的环境配置(基于spring+springMVC+redis)
特别感谢lhacker分享的文章,对我帮助很大 http://www.aiuxian.com/article/p-1913280.html 基本的知识就不在这里讲了,在实战中体会shiro的整体设计理 ...
- Shiro入门之一 -------- Shiro权限认证与授权
一 将Shirojar包导入web项目 二 在web.xml中配置shiro代理过滤器 注意: 该过滤器需要配置在struts2过滤器之前 <!-- 配置Shiro的代理过滤器 --> ...
- [shiro] - 怎样使用shiro?
shiro是什么? Shiro是apache旗下的一个开源框架, 它将软件系统的安全认证相关的功能抽取出来, 实现用户身份认证, 权限授权, 加密, 会话管理等功能, 组成一个通用的安全认证框架. 为 ...
- Apache Shiro学习-2-Apache Shiro Web Support
Apache Shiro Web Support 1. 配置 将 Shiro 整合到 Web 应用中的最简单方式是在 web.xml 的 Servlet ContextListener 和 Fil ...
- 细说shiro之一:shiro简介
官网:https://shiro.apache.org/ 一. Shiro是什么Shiro是一个Java平台的开源权限框架,用于认证和访问授权.具体来说,满足对如下元素的支持: 用户,角色,权限(仅仅 ...
- 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权
原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...
- 【Shiro】Apache Shiro架构之自定义realm
[Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之权限认证(Authorization) [Shiro]Apache S ...
- 【Shiro】Apache Shiro架构之权限认证(Authorization)
Shiro系列文章: [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shir ...
随机推荐
- 【Excel】SUMIF 或用 筛选器 实现挑选含有某些字段的值,然后把这些值所对应的后面某列上的值相加
Background: 挑选含有某些字段的值,然后把这些值所对应的后面某列上的值相加.比如挑选下表中,所有带有“MX104”这个字段的值,然后把它的后面total那一列的值相加. Solution: ...
- VMware5.5-虚拟机的迁移和资源分配
虚拟机的迁移 迁移:将虚拟机从一台主机(或数据存储)移到另一台主机(或数据存储). 迁移类型: 冷迁移 迁移处于关闭状态的虚拟机. 挂起 迁移处于挂起状态的虚拟机. vMotion 迁移处于开启状态的 ...
- BZOJ4910 : [Sdoi2017] 苹果树
问题等价于树形依赖背包,允许一条链每个点各免费一次. 设$f[i][j]$表示按DFS序考虑到$i$,体积为$j$的最大收益. 先放入不能免费的物品,等遍历完儿子后再放入必选的物品,那么$i$到根路径 ...
- Python实现图像信息隐藏
Python实现图像信息隐藏 之前学习密码学的时候老师有提到过『信息隐藏』,现在用图像的方法尝试一下.思想是:把信息藏到RGB通道中的B通道,然后利用奇偶性可以恢复过来 原理 从源图中提取文字图像信息 ...
- 4989: [Usaco2017 Feb]Why Did the Cow Cross the Road
题面:4989: [Usaco2017 Feb]Why Did the Cow Cross the Road 连接 http://www.lydsy.com/JudgeOnline/problem.p ...
- 关于 extern "C"的说明
在用C++的项目源码中,经常会不可避免的会看到下面的代码 #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __cplus ...
- Zepto tap 穿透bug、解决移动端点击穿透问题
当两个层重叠在一起时,或是有个弹窗,使用Zepto的tap事件时,点击上面的一层时会触发下面一层的事件,特别是底层如果是input框时,必“穿 透”,“google”说原因是“tap事件实际上是在冒泡 ...
- 【数论】Factors of Factorial @upcexam6503
问题 G: Factors of Factorial 时间限制: 1 Sec 内存限制: 128 MB提交: 57 解决: 33[提交][状态][讨论版][命题人:admin] 题目描述 You ...
- tfs2015 生成与发布 配置
先来看一张微软官方的自动生成与发布架构图,以便了解很多概念间的关系 1.安装好TFS2015(可以参考TFS2010的安装过程,尤其是账号权限相关),我自己是从TFS2010一路升级上来的(TFS20 ...
- Linux脚本程序
#!/bin/bash # array-ops.sh: 数组更多有趣的用法. array=( zero one two three four five ) # 元素 ]} # zero } # zer ...