`
m635674608
  • 浏览: 5041911 次
  • 性别: 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示例

    在Spring框架中,`DelegatingFilterProxy`是一个非常有用的工具,它允许我们将Spring的Bean作为Servlet过滤器(Filter)来使用。这个组件是Spring MVC的一部分,主要用于将Spring的AOP(面向切面编程)能力引入到Web...

    3.springSecurity源码分析1

    1. DelegatingFilterProxy:这是一个Spring框架提供的过滤器,它作为代理来调用实际的Filter。在web.xml中,filter-name设置为"springSecurityFilterChain"的原因在于,SpringSecurity的配置约定是将核心过滤器链的...

    spring过滤器

    在Spring框架中,我们通常使用DelegatingFilterProxy来整合Spring的AOP(面向切面编程)功能与Servlet过滤器。 1. **DelegatingFilterProxy**: 这是Spring提供的一个特殊Filter,它的主要作用是将过滤器的职责委托...

    spring安全框架3.2

    在`web.xml`中配置的`DelegatingFilterProxy`实际上是Spring的一个特殊过滤器,它将请求委托给Spring应用上下文中对应的Bean。在这个例子中,我们看到它被配置为`myFilter`,并且映射到所有URL(`/*`)。`...

    过滤器 spring4.1+jdk1.8版本

    DelegatingFilterProxy是一个特殊的Servlet Filter,它将过滤器的工作委托给Spring容器管理的一个Bean。这样,我们可以在Spring配置文件中定义一个Bean,并将其类型设置为实际的过滤器实现类。 Java 8 (JDK1.8)引入...

    使用Spring Security开发安全的Java程序.pdf

    在web.xml文件中,我们需要添加一个名为`springSecurityFilterChain`的过滤器,其类为`org.springframework.web.filter.DelegatingFilterProxy`,URL模式为`/*`。这个配置使得Spring Security的web机制可以处理所有...

    spring security 3

    紧接着,文档介绍了配置web.xml文件的步骤,包括添加DelegatingFilterProxy过滤器代理。这个过滤器能够代理SpringSecurity中的核心部分,即过滤器,从而让这些过滤器可以享受到SpringWebApplicationContext的生命...

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

    SSH(Spring、Struts、Hibernate)是Java Web开发中经典的三大框架,它们分别负责应用的依赖注入、MVC层和持久层操作。SSH集成代理2.0版是对这些框架进行优化和整合的一个版本,旨在提高开发效率和系统性能。...

    springboot+Shiro 实现动态授权

    DelegatingFilterProxy filterProxy = new DelegatingFilterProxy(); filterProxy.setTargetFilterLifecycle(true); filterProxy.setTargetBeanName("securityManager"); return filterProxy; } ``` 总结来说,...

    Spring security

    - 在 `web.xml` 文件中配置 `DelegatingFilterProxy` 过滤器,这是启动 Spring Security 的关键步骤。该过滤器负责处理所有的请求,并将其转发给 Spring Security 配置的 Filter 链。 ```xml &lt;filter-name&gt;...

    shiro 配置文件

    Shiro 的 Web 支持通常通过 Filter 方式进行,主要涉及两个 Filter:`ShiroFilter` 和 `DelegatingFilterProxy`。`ShiroFilter` 是 Shiro 提供的核心过滤器,负责拦截请求并执行相应的安全逻辑。而 `...

    Shiro和cas部分整合

    接下来,配置Shiro的过滤器 `shiroFilter`,它是基于Spring的代理过滤器 `DelegatingFilterProxy`,用于处理所有请求。`targetFilterLifecycle` 参数设置为 `true` 表示Shiro的过滤器生命周期应该由Spring管理。 ...

    shiro 与 spring 整合、动态过滤链、以及认证、授权.docx

    例如,设置 `contextConfigLocation` 参数来指定 Spring 应用上下文配置文件的位置,并使用 `DelegatingFilterProxy` 作为 Shiro 过滤器,确保过滤器生命周期与 Spring 管理的 bean 生命周期同步。 ```xml ...

    权限安全管理(Spring_security_2.0)

    Spring Security通过一系列过滤器实现权限控制,DelegatingFilterProxy作为代理类管理这些过滤器。配置示例如下: ```xml &lt;filter-name&gt;springSecurityFilterChain &lt;filter-class&gt;org.springframework.web....

    Spring Security简易配置指南

    `DelegatingFilterProxy`是一个代理Filter,它将请求委托给Spring的应用上下文中的Bean。确保Spring Security的Filter排在其他Filter之前,例如Struts2的Filter,以避免数据处理顺序问题。 ```xml &lt;filter-name&gt;...

    一个Shiro的简单例子1

    这里使用了 Spring 的 `DelegatingFilterProxy` 过滤器,它允许 Spring 容器来管理和初始化 Shiro 过滤器。 然后,我们需在 Spring 配置文件中创建 Shiro 的安全管理器(SecurityManager)。它是 Shiro 的核心组件...

    SpringSecurity3.1实际摸索总结

    其中,`DelegatingFilterProxy` 是核心过滤器,它作为其他所有过滤器的代理,必须在 `web.xml` 中配置,并且名称应设为 `springSecurityFilterChain`。这个过滤器与 Spring Bean 配置文件中 `&lt;http&gt;` 元素的 ID 相...

    尚硅谷Shiro视频教程

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

    单点登录SpringSsession

    在Spring Session的配置中,`DelegatingFilterProxy`将通过指定的名字(如`springSessionRepositoryFilter`)去查找Spring容器中对应的Bean,并将其转换为过滤器进行工作。 - **Cookie跨域问题**:在多域名的环境中...

    精彩:Spring Security 演讲PPT

    1. **添加过滤器**: 在`web.xml`中加入`DelegatingFilterProxy`,用于将请求委托给Spring Security的过滤器链。 ```xml &lt;filter-name&gt;springSecurityFilterChain &lt;filter-class&gt;org.springframework.web.filter...

Global site tag (gtag.js) - Google Analytics