`
m635674608
  • 浏览: 4931740 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

DelegatingFilterProxy

 
阅读更多
摘要: 配置过滤器代理类,通过spring配置的bean来加载过滤器,实际并未解决我所遇到的问题,shiro集成springmvc过程中,配置shiroFiltor抛异常,无法加载shiroFilter这个bean,然而实际我在spring中已经配置好了对应 bean

在web.xml中进行配置,对所有的URL请求进行过滤,就像"击鼓传花"一样,链式处理。

配置分为两种A和B。

A:普通配置

在web.xml中增加如下内容:
<filter>
    <filter-name>permissionFilter</filter-name>
    <filter-class>com.taobao.riskm.filter.PermissionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>permissionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
由filter和filter-mapping构成。filter指定过滤器处理类(实现了Filter接口),filter-mapping指定过滤的规则。

B:高级配置(允许代理注入Spring bean)

在web.xml中增加如下内容:
<filter>
    <filter-name>permission</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
 <filter-mapping>
    <filter-name>permission</filter-name>
    <url-pattern>*.htm</url-pattern>
</filter-mapping>

在spring bean配置中加入:
 <bean id="permission" class="com.taobao.kfc.kwb.web.permission.PermissionHttpServlet"></bean>

因为filter比bean先加载,也就是spring会先加载filter指定的类到Container中,这样filter中注入的spring bean就为null了。

解决办法:
先filter中加入DelegatingFilterProxy类,"targetFilterLifecycle"指明作用于filter的所有生命周期。
原理是,DelegatingFilterProxy类是一个代理类,所有的请求都会首先发到这个filter代理,然后再按照"filter-name"委派到spring中的这个bean。

在Spring中配置的bean的name要和web.xml中的<filter-name>一样.

此外,spring bean实现了Filter接口,但默认情况下,是由spring容器来管理其生命周期的(不是由tomcat这种服务器容器来管理)。如果设置"targetFilterLifecycle"为True,则spring来管理Filter.init()和Filter.destroy();若为false,则这两个方法失效!!

B和A最大的不同是,A是一个filter,优先被加载到container中,无法调用spring中后续的bean;而B是一个spring bean,可以引用其他的bean,而请求都通过DelegatingFilterProxy类委派给B!

B的另外一种配置方式:

<filter>
    <filter-name>permission</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>Spring-bean-name</param-value>
    </init-param>
</filter>

也就是增加一个"targetBeanName"的参数,值为实际执行Filter的bean。

注意:Filter和servlet都可以对URL进行处理,Filter是一个链式处理,只要你想继续处理就可以传递下去;而Servlet则是一次处理并返回!适合简单逻辑处理。

附录:
<url-pattern>可以选择以下几种形式

/*  所有资源
*.html  以html结尾的资源
/fold/* 指定目录
/abc.html   指定文件
以”/’开头和以”/*”结尾的是用来做路径映射的,
以前缀”*.”开头的是用来做扩展映射的。

为什么定义”/*.action”这样一个看起来很正常的匹配会错?
因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。

 

https://my.oschina.net/u/2537743/blog/817072

分享到:
评论

相关推荐

    DelegatingFilterProxy示例

    DelegatingFilterProxy代码示例,包含普通filter和代理filter两个示例,帮助加深对DelegatingFilterProxy的理解。

    SSH集成代理2.0版和struts.xml中DelegatingActionProxy代理搭配

    SSH集成代理2.0版和struts.xml中DelegatingActionProxy代理搭配

    尚硅谷Shiro视频教程

    尚硅谷_Shiro_DelegatingFilterProxy · 06. 尚硅谷_Shiro_权限 URL 配置细节 · 07. 尚硅谷_Shiro_认证思路分析 · 08.尚硅谷_Shiro_实现认证流程 · 09.尚硅谷_Shiro_实现认证 Realm · 10.尚硅谷_Shiro_密码...

    简单配置 shiro + spring +springMVC+hibernate简单框架

    org.springframework.web.filter.DelegatingFilterProxy &lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;shiroFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; maven...

    Spring Security 中文教程.pdf

    7.1. DelegatingFilterProxy 7.2. FilterChainProxy 7.2.1. 绕过过滤器链 7.3. 过滤器顺序 7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ...

    单点登录sso-shiro-cas-maven

    &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy &lt;param-name&gt;targetFilterLifecycle &lt;param-value&gt;true &lt;filter-name&gt;shiroFilter &lt;url-pattern&gt;/* ``` ## 系统...

    Spring Security-3.0.1中文官方文档(翻译版)

    7.1. DelegatingFilterProxy 7.2. FilterChainProxy 7.2.1. 绕过过滤器链 7.3. 过滤器顺序 7.4. 使用其他过滤器—— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ...

    spring-web-2.5.jar

    org.springframework.web.filter.DelegatingFilterProxy.class org.springframework.web.filter.GenericFilterBean.class org.springframework.web.filter.Log4jNestedDiagnosticContextFilter.class org.spring...

    SpringSecurity 3.0.1.RELEASE.CHM

    7.1. DelegatingFilterProxy 7.2. FilterChainProxy 7.2.1. 绕过过滤器链 7.3. 过滤器顺序 7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ...

    Nginx安装包

    4 &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy 5 6 7 &lt;filter-name&gt;springSessionRepositoryFilter 8 &lt;url-pattern&gt;/* 9 完成这一步以后,我们对redis的集成就完成了,接下来我们测试...

    SPRING API 2.0.CHM

    DelegatingFilterProxy DelegatingIntroductionInterceptor DelegatingJob DelegatingMessageSource DelegatingNavigationHandlerProxy DelegatingPhaseListenerMulticaster DelegatingRequestProcessor ...

    Spring Security3 张卫滨(译)

    添加Spring DelegatingFilterProxy到web.xml文件...................................................... 20 添加Spring Security XML配置文件的应用到web.xml ................................................ ...

    spring security 参考手册中文版

    13.1 DelegatingFilterProxy 112 13.2 FilterChainProxy 113 13.2.1绕过滤网链 115 13.3过滤器排序 115 13.4请求匹配和HttpFirewall 116 13.5与其他基于过滤器的框架一起使用 118 13.6高级命名空间配置 118 14.核心...

    gradle-spring-4-mvc-boilerplate

    如该软件包所指定的那样,DelegatingFilterProxy被认为可与Spring Web MVC一起使用,并且仅与Spring Web MVC一起使用(aka控制器,带或不带注释)。 它似乎不能与普通的servlet-jsps一起使用,因为您似乎正在尝试...

    inject-dependencies-into-your-filters

    Dead Code Rising 代码示例展示了如何使用 Spring 的 DelegatingFilterProxy 将依赖项注入过滤器。 在阅读文章。

Global site tag (gtag.js) - Google Analytics