5

У меня есть приложение spring-boot.Как очистить фасоль в фильтрах сервлетов в весеннем приложении?

У меня нет ApplicationContext.xml или web.xml файлов в моем проекте. Я предпочитаю избегать их и все настроено в Java-коде.

Я прочитал следующие сообщения о переработке бобов в сервлет-фильтрах.

  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.

Мой вопрос заключается в том, как подключить компонент в фильтр и не использовать файлы 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> 

ответ

6

Вы должны добавить FilterRegistrationBean к главному классу приложений (класс с аннотацией @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 не аннотируется должным образом или не находится на пути сканирования пакета по умолчанию), вы можете указать Весна, чтобы обеспечить его (также в вашем классе @SpringBootApplication):

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

Если у меня есть несколько фильтров, которые необходимо применять, как указано в заказе? –

+0

'FilterRegistrationBean # setOrder (int)', я обновил ответ. – mzc

+0

Спасибо, я буду тестировать это сейчас –