在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
相关推荐
在Spring框架中,`DelegatingFilterProxy`是一个非常有用的工具,它允许我们将Spring的Bean作为Servlet过滤器(Filter)来使用。这个组件是Spring MVC的一部分,主要用于将Spring的AOP(面向切面编程)能力引入到Web...
1. DelegatingFilterProxy:这是一个Spring框架提供的过滤器,它作为代理来调用实际的Filter。在web.xml中,filter-name设置为"springSecurityFilterChain"的原因在于,SpringSecurity的配置约定是将核心过滤器链的...
在Spring框架中,我们通常使用DelegatingFilterProxy来整合Spring的AOP(面向切面编程)功能与Servlet过滤器。 1. **DelegatingFilterProxy**: 这是Spring提供的一个特殊Filter,它的主要作用是将过滤器的职责委托...
在`web.xml`中配置的`DelegatingFilterProxy`实际上是Spring的一个特殊过滤器,它将请求委托给Spring应用上下文中对应的Bean。在这个例子中,我们看到它被配置为`myFilter`,并且映射到所有URL(`/*`)。`...
DelegatingFilterProxy是一个特殊的Servlet Filter,它将过滤器的工作委托给Spring容器管理的一个Bean。这样,我们可以在Spring配置文件中定义一个Bean,并将其类型设置为实际的过滤器实现类。 Java 8 (JDK1.8)引入...
在web.xml文件中,我们需要添加一个名为`springSecurityFilterChain`的过滤器,其类为`org.springframework.web.filter.DelegatingFilterProxy`,URL模式为`/*`。这个配置使得Spring Security的web机制可以处理所有...
紧接着,文档介绍了配置web.xml文件的步骤,包括添加DelegatingFilterProxy过滤器代理。这个过滤器能够代理SpringSecurity中的核心部分,即过滤器,从而让这些过滤器可以享受到SpringWebApplicationContext的生命...
SSH(Spring、Struts、Hibernate)是Java Web开发中经典的三大框架,它们分别负责应用的依赖注入、MVC层和持久层操作。SSH集成代理2.0版是对这些框架进行优化和整合的一个版本,旨在提高开发效率和系统性能。...
DelegatingFilterProxy filterProxy = new DelegatingFilterProxy(); filterProxy.setTargetFilterLifecycle(true); filterProxy.setTargetBeanName("securityManager"); return filterProxy; } ``` 总结来说,...
- 在 `web.xml` 文件中配置 `DelegatingFilterProxy` 过滤器,这是启动 Spring Security 的关键步骤。该过滤器负责处理所有的请求,并将其转发给 Spring Security 配置的 Filter 链。 ```xml <filter-name>...
Shiro 的 Web 支持通常通过 Filter 方式进行,主要涉及两个 Filter:`ShiroFilter` 和 `DelegatingFilterProxy`。`ShiroFilter` 是 Shiro 提供的核心过滤器,负责拦截请求并执行相应的安全逻辑。而 `...
接下来,配置Shiro的过滤器 `shiroFilter`,它是基于Spring的代理过滤器 `DelegatingFilterProxy`,用于处理所有请求。`targetFilterLifecycle` 参数设置为 `true` 表示Shiro的过滤器生命周期应该由Spring管理。 ...
例如,设置 `contextConfigLocation` 参数来指定 Spring 应用上下文配置文件的位置,并使用 `DelegatingFilterProxy` 作为 Shiro 过滤器,确保过滤器生命周期与 Spring 管理的 bean 生命周期同步。 ```xml ...
Spring Security通过一系列过滤器实现权限控制,DelegatingFilterProxy作为代理类管理这些过滤器。配置示例如下: ```xml <filter-name>springSecurityFilterChain <filter-class>org.springframework.web....
`DelegatingFilterProxy`是一个代理Filter,它将请求委托给Spring的应用上下文中的Bean。确保Spring Security的Filter排在其他Filter之前,例如Struts2的Filter,以避免数据处理顺序问题。 ```xml <filter-name>...
这里使用了 Spring 的 `DelegatingFilterProxy` 过滤器,它允许 Spring 容器来管理和初始化 Shiro 过滤器。 然后,我们需在 Spring 配置文件中创建 Shiro 的安全管理器(SecurityManager)。它是 Shiro 的核心组件...
其中,`DelegatingFilterProxy` 是核心过滤器,它作为其他所有过滤器的代理,必须在 `web.xml` 中配置,并且名称应设为 `springSecurityFilterChain`。这个过滤器与 Spring Bean 配置文件中 `<http>` 元素的 ID 相...
尚硅谷_Shiro_DelegatingFilterProxy · 06. 尚硅谷_Shiro_权限 URL 配置细节 · 07. 尚硅谷_Shiro_认证思路分析 · 08.尚硅谷_Shiro_实现认证流程 · 09.尚硅谷_Shiro_实现认证 Realm · 10.尚硅谷_Shiro_密码...
在Spring Session的配置中,`DelegatingFilterProxy`将通过指定的名字(如`springSessionRepositoryFilter`)去查找Spring容器中对应的Bean,并将其转换为过滤器进行工作。 - **Cookie跨域问题**:在多域名的环境中...
1. **添加过滤器**: 在`web.xml`中加入`DelegatingFilterProxy`,用于将请求委托给Spring Security的过滤器链。 ```xml <filter-name>springSecurityFilterChain <filter-class>org.springframework.web.filter...