java - web.xml 中映射的 Filter 实现中的 Spring 注入(inject)

标签 java spring web.xml servlet-filters

web.xml:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.mypackage.MyFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/myFilterPattern/*</url-pattern>
</filter-mapping>

我的过滤器:

public class MyFilter implements Filter {

    @Autowired
    InjectedBean someInjectedBean;

但是,拦截/myFilterPattern/*请求时,MyFilter.doFilter(...)中的someInjectedBean仍然为null,也就是说尚未注入(inject)。相同的 bean (InjectedBean) 可以很好地注入(inject)到 web.xml 中未引用的其他上下文组件中。

是因为容器过滤发生在 Spring 上下文之外吗?有什么方法可以将 Filter 实现中的 Spring 注入(inject)映射到 web.xml 中吗?

最佳答案

由于 Filter 不是 spring bean(它是一个 Web 组件),因此注入(inject)无法在其中工作。 Springs 不会注入(inject)到 Web 组件内部。

使用 DelegatingFilterProxy,这是一个过滤器实现,它将 springbean 名称作为初始化参数,并将过滤器请求委托(delegate)给该 bean。

<filter>
  <filter-name>myFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  <init-param>
    <param-name>targetBeanName</param-name>
    <param-value>myFilterBean</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>myFilter</filter-name>
  <url-pattern>/myFilterPattern/*</url-pattern>
</filter-mapping>

并在 Spring 上下文中创建一个名为 myFilterBean 的 Bean。

public class MyFilter extends GenericFilterBean {

    @Autowired
    InjectedBean someInjectedBean;
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
    }
}

关于java - web.xml 中映射的 Filter 实现中的 Spring 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43769781/

相关文章:

java - Tomcat 8 找不到自定义 tld

java - 从文件中读取并在 textarea java 中显示

java - 如何向基于 Spring 配置的基于 Apache CXF 的 Web 服务客户端提供服务器地址?

java - 单击 TextView 时我的应用程序崩溃

java - 响应实体异常处理程序 : handleMethodArgumentNotValid Not Intercepted

java - 未知 SMTP 主机 : smtp. live.com

java - 为一个 servlet 配置 web.xml (Tomcat 5) 以处理所有传入请求?

java - url 模式和通配符

java - 如何设计类及其方法

java - 在Java中无法识别多个生产者/消费者何时完成