gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:51:33 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com