spring - 如何在 Spring 应用程序的 servlet 过滤器中 Autowiring bean?

标签 spring spring-mvc dependency-injection spring-boot autowired

我有一个 spring-boot 应用程序。

我的项目中没有 ApplicationContext.xmlweb.xml 文件。我更喜欢避免它们并在 Java 代码中配置所有内容。

我已阅读以下有关 servlet 过滤器中 Bean 注入(inject)的帖子。

  1. How can I get a Spring bean in a servlet filter?

  2. http://www.deadcoderising.com/2015-05-04-dependency-injection-into-filters-using-delegatingfilterproxy/

  3. spring injection in servlet filter

读完它们后,我开始使用DelegatingFilterProxy

我的问题是如何将 bean Autowiring 到过滤器中并避免使用 xml 文件,尤其是对于 DelegatingFilterProxy 配置。

截取的代码可以从 github. 中托管的第二篇文章中获取。

public class AuditHandler {

    public void auditRequest(String appName, ServletRequest request) {
        System.out.println(appName + ": Received request from " + request.getRemoteAddr() );
    }
}

public class AuditFilter implements Filter {

    private final AuditHandler auditHandler;
    private String appName;

    public AuditFilter(AuditHandler auditHandler) {
        this.auditHandler = auditHandler;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        auditHandler.auditRequest(appName, request);
        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        appName = filterConfig.getInitParameter("appName");
    }

    public void destroy() {}
}

ApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="auditHandler" class="com.deadcoderising.AuditHandler">
    </bean>

    <bean id="auditFilter" class="com.deadcoderising.AuditFilter">
        <constructor-arg ref="auditHandler"/>
    </bean>
</beans>

web.xml

<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         metadata-complete="true">

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext*.xml</param-value>
    </context-param>


    <filter>
        <filter-name>auditFilter</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>
        <init-param>
            <param-name>appName</param-name>
            <param-value>di-example</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>auditFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

最佳答案

您应该将 FilterRegistrationBean 添加到您的主 Application 类(使用 @SpringBootApplication 注释的类),并让 Spring 提供 AuditHandler 的实例:

@Bean
@Autowired
public FilterRegistrationBean auditFilterRegistration(AuditHandler handler) {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    filterRegistrationBean.setFilter(new AuditFilter(handler));
    filterRegistrationBean.setOrder(3); // ordering in the filter chain
    return filterRegistrationBean;
}

如果这不起作用(例如,您的 AuditHandler 实现未正确注释或不在默认包扫描路径上),您可以指示 Spring 提供它(也在您的 @ SpringBootApplication注释类):

@Bean
public AuditHandler auditHandler() {
    return new AuditHandlerImplementation();
}

关于spring - 如何在 Spring 应用程序的 servlet 过滤器中 Autowiring bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32127258/

相关文章:

java - 如何定义DefaultListableBeanFactory的序列化id?

spring - 如何从传统的 Java Web 应用程序(使用 web.xml)迁移到 Spring Boot?

java - org.springframework.beans.factory.NoSuchBeanDefinitionException异常

java - 如何捕获从@Around 抛出的连接点中的异常

java - 如何使用 Spring 安全更新过滤器的 header 参数?

java - 如何以 <form :input> the value of Set that is a field of the main object of the form 打印

java - 下载期间出现 Spring Boot 异常导致空文件

c# - 抽象可重用库中的合成根

asp.net - 使用 2 个参数注入(inject)构造函数不起作用

asp.net-mvc-2 - 使用 CaSTLe Windsor 在遗留代码中注入(inject) HttpContext.Current.Session