第八章 拦截器机制(二) 拦截器链
来源:互联网 发布:淘宝 情趣内衣 推荐 编辑:程序博客网 时间:2024/05/22 05:21
Shiro 对Servlet 容器的FilterChain 进行了代理,即ShiroFilter 在继续Servlet 容器的Filter链的执行之前,通过ProxiedFilterChain 对Servlet 容器的FilterChain 进行了代理;即先走Shiro 自己的Filter 体系,然后才会委托给Servlet 容器的FilterChain 进行Servlet 容器级别的Filter链执行;
Shiro的ProxiedFilterChain执行流程:
1、先执行Shiro自己的Filter链;
2、再执行Servlet容器的Filter链(即原始的Filter)。
而 ProxiedFilterChain 是通过FilterChainResolver 根据配置文件中[urls]部分是否与请求的URL是否匹配解析得到的。
FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain);
即传入原始的chain得到一个代理的chain。
Shiro 内部提供了一个路径匹配的FilterChainResolver 实现:PathMatchingFilterChainResolver,其根据[urls]中配置的url 模式(默认Ant 风格)=拦截器链和请求的url是否匹配来解析得到配置的拦截器链的;而PathMatchingFilterChainResolver内部通过FilterChainManager维护着拦截器链,比如DefaultFilterChainManager实现维护着url 模式与拦截器链的关系。因此我们可以通过FilterChainManager 进行动态动态增加url模式与拦截器链的关系。
DefaultFilterChainManager 会默认添加org.apache.shiro.web.filter.mgt.DefaultFilter 中声明的拦截器:
public enum DefaultFilter {anon(AnonymousFilter.class),authc(FormAuthenticationFilter.class),authcBasic(BasicHttpAuthenticationFilter.class),logout(LogoutFilter.class),noSessionCreation(NoSessionCreationFilter.class),perms(PermissionsAuthorizationFilter.class),port(PortFilter.class),rest(HttpMethodPermissionFilter.class),roles(RolesAuthorizationFilter.class),ssl(SslFilter.class),user(UserFilter.class);}
下一节会介绍这些拦截器的作用。
如果要注册自定义拦截器,IniSecurityManagerFactory/WebIniSecurityManagerFactory在启动时会自动扫描ini 配置文件中的[filters]/[main]部分并注册这些拦截器到DefaultFilterChainManager;且创建相应的url 模式与其拦截器关系链。如果使用Spring 后续章节会介绍如果注册自定义拦截器。
如果想自定义FilterChainResolver,可以通过实现WebEnvironment接口完成:
public class MyIniWebEnvironment extends IniWebEnvironment{protected FilterChainResolver createFilterChainResolver() {//在此处扩展自己的FilterChainResolverreturn super.createFilterChainResolver();}}
如果覆盖了IniWebEnvironment 默认的FilterChainResolver,需要自己来解析请求与FilterChain 之间的关系。如果想动态实现url-拦截器的注册,就可以通过实现此处的FilterChainResolver来完成,比如:
public class MyIniWebEnvironment extends IniWebEnvironment{protected FilterChainResolver createFilterChainResolver() {//在此处扩展自己的FilterChainResolver//1. 创建FilterChainResolverPathMatchingFilterChainResolver filterChainResolver = new PathMatchingFilterChainResolver();//2. 创建FilterChainManagerDefaultFilterChainManager filterChainManager = new DefaultFilterChainManager();//3. 注册Filterfor(DefaultFilter filter:DefaultFilter.values()){filterChainManager.addFilter(filter.name(), (Filter) ClassUtils.newInstance(filter.getFilterClass()));}//4. 注册URL-Filter的映射关系filterChainManager.addToChain("/login.jsp", "authc");filterChainManager.addToChain("/unauthorized.jsp", "anon");filterChainManager.addToChain("/**", "authc");filterChainManager.addToChain("/**", "roles","admin");//5. 设置Filter的属性FormAuthenticationFilter authcFilter = (FormAuthenticationFilter) filterChainManager.getFilter("authc");authcFilter.setLoginUrl("/login.jsp");RolesAuthorizationFilter rolesFilter = (RolesAuthorizationFilter) filterChainManager.getFilter("roles");rolesFilter.setUnauthorizedUrl("/unauthorized.jsp");filterChainResolver.setFilterChainManager(filterChainManager);return filterChainResolver;}}
此处自己去实现注册filter,及url 模式与filter 之间的映射关系。可以通过定制FilterChainResolver或FilterChainManager来完成诸如动态URL匹配的实现。
然后再web.xml中进行如下配置Environment:
<context-param><param-name>shiroEnvironmentClass</param-name><param-value>com.github.zhangkaitao.shiro.chapter8.web.env.MyIniWebEnvironment</param-value></context-param>
- 第八章 拦截器机制(二) 拦截器链
- 第八章 拦截器机制
- 第八章------拦截器机制
- 第八章 拦截器机制
- 第八章 拦截器机制(一) 拦截器介绍
- 第八章 拦截器机制(三) 自定义拦截器
- 第八章 拦截器机制(四) 默认拦截器
- 第八章 Shiro拦截器机制
- 第八讲 拦截器
- Struts2 拦截器机制
- 第八章 拦截器机制——《跟我学Shiro》
- 第八章 拦截器机制——《跟我学Shiro》2
- 第八章 拦截器机制——《跟我学Shiro》
- 第八章 拦截器机制——《跟我学Shiro》[张开涛]
- 第八章 拦截器机制——《跟我学Shiro》2
- struts2拦截器篇(二)自定义拦截器
- struts2拦截器(二) 自定义拦截器
- struts2-拦截器(二)方法拦截器
- 全文检索之sphinx源码分析--配置文件和轮转操作
- Ubuntu16.04下安装OpenStack
- Forbidden--实验吧
- 深度学习DeepLearning.ai系列课程学习总结:3. Python矢量化实现神经网络
- 设计和QQ一样动态登录界面
- 第八章 拦截器机制(二) 拦截器链
- JAVA学习59_ java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \
- MYSQL注入天书之服务器(两层)架构
- TCP/IP三次握手四次挥手
- Java SE 基础(一)
- Unity Shader-渲染队列,ZTest,ZWrite,Early-Z
- webstrom:使用js无法指定路径问题
- Qual_A:传话游戏
- 遇到的面试问题总结