【问题标题】:spring injection in servlet filter [duplicate]servlet过滤器中的弹簧注入[重复]
【发布时间】:2013-01-23 19:56:07
【问题描述】:

我正在尝试对 servlet 过滤器进行弹簧注入。过滤器是引用的 jar 文件的一部分。所以。我无法将其更改为拦截器。在我的插件项目的 web.xml 中

<filter>
    <filter-name>CustomFilter</filter-name>    
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>    
    <init-param>    
        <param-name>someinitparam</param-name>    
        <param-value>value to it</param-value>    
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CustomFilter</filter-name>
    <url-pattern>/mywebservices/*</url-pattern>
</filter-mapping>

在spring.xml中我会这样使用

<bean id="CustomFilter" class="com.abc.CustomFilter"></bean>

spring.xml中已经配置了一些过滤器

<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
    <property name="filterInvocationDefinitionSource">
        <value>
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
            PATTERN_TYPE_APACHE_ANT
            /mywebservices/*=some existing filters
        </value>              
    </property>
</bean>

由于我已经在 web.xml 中指定了我的 url 模式,我是否需要在 filterChainProxy 中再次添加为

/mywebservices/**=CustomFilter, some existing filters

它会起作用吗?

请提出建议。

【问题讨论】:

  • 会有用吗?你试过了吗?
  • 嗯.. 听起来很棘手。 Spring 依赖注入通常是在 spring 上下文中创建的 beans 上完成的——而过滤器是由 java ee 服务器本身创建的。也许你能做的是——如果你能确定在你的 Filter 类被创建时 spring 上下文已经准备好了——尝试以某种方式获取对它的引用。顺便说一下,你能告诉我们更多关于你的应用程序的信息——做你使用 Spring MVC 吗?如果是这样,您可能不需要使用 servlet 过滤器
  • @TechExchange。我已经尝试过了,但它会导致我的应用程序出现严重错误。
  • @gerrytan。过滤器是 jar 文件之一的一部分。我正在使用 Jive 工具。仅基于它的 Spring MVC。
  • @User222 如果它导致严重错误,您应该说出它是什么。此外,您不应使用 Acegi Security,因为它已不再开发且不安全。

标签: java spring spring-mvc spring-security


【解决方案1】:

您可以像在 web.xml 中那样配置过滤器

<filter>
   <filter-name>CustomFilter</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
   <filter-name>CustomFilter</filter-name>
   <url-pattern>/mywebservices/*</url-pattern>
</filter-mapping>

然后在spring.xml中注入属性

<bean id="CustomFilter" class="com.abc.CustomFilter">
   <property name="someParameter">
      <value>some value</value>
   </property>
</bean>

【讨论】:

  • 感谢您的回答。我们可以将 servlet 过滤器的 in-it 参数注册为 元素的属性,还是必须在 web.xml 的 元素中指定它。
  • 而且我已经将 web.xml 中的 url 模式指定为 /mywebservices/*。我是否需要再次将其作为值添加到 bean 中的 /myservice/** 中,id 为 filterChainProxy。请帮忙
  • FilterChainProxy 是可选的,用于对执行哪些过滤器进行细粒度控制。通常你不需要明确定义它。如果由于其他原因而存在,那么如果您还在那里添加过滤器,那么您做得很好
  • 不,这行不通。其他答案是正确的,基本上你让你的 web 上下文创建一个过滤器实例,然后你告诉 Spring 创建另一个实例,它不会用作过滤器。您可以使用 thisthis 之类的替代方法来获取 Spring 上下文 bean。
【解决方案2】:

我认为你不能在 spring 上下文之外注入 bean,并且你的 servlet 过滤器在 spring 上下文之外。如果您想在上下文中使用过滤器,那么我建议您使用 spring web 拦截器。这些拦截器位于 Spring 上下文中,您可以通过这些拦截器利用 Spring 容器功能。

【讨论】:

  • Spring Security 使用在 Spring 应用程序上下文中定义的许多过滤器。这就是DelegatingFilterProxy 的用途。
  • 这个答案根本不正确
猜你喜欢
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2016-04-17
  • 2018-08-06
  • 2017-03-18
  • 2017-03-18
相关资源
最近更新 更多