5

Tôi có đơn đăng ký spring-boot.Làm thế nào để autowire đậu trong các bộ lọc servlet trong ứng dụng mùa xuân?

Tôi không có ApplicationContext.xml hoặc web.xml tập tin trong dự án của tôi. Tôi thích tránh chúng và có mọi thứ được cấu hình trong mã Java.

Tôi đã đọc các bài viết sau đây về tiêm đậu trong các bộ lọc servlet.

  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

Sau khi đọc chúng, tôi bắt đầu sử dụng DelegatingFilterProxy.

Câu hỏi của tôi là cách autowire đậu vào bộ lọc và tránh sử dụng các tệp xml đặc biệt cho cấu hình DelegatingFilterProxy.

Mã snipped có sẵn từ bài thứ hai tổ chức tại 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> 

Trả lời

6

Bạn nên thêm một FilterRegistrationBean đến lớp ứng dụng chính của bạn (lớp chú thích với @SpringBootApplication) và để cho mùa xuân cung cấp thể hiện của các 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; 
} 

Nếu cách này không hoạt động (ví dụ: AuditHandler triển khai của bạn không được chú thích đúng cách hoặc không nằm trong đường dẫn quét gói mặc định), bạn có thể hướng dẫn Sp đổ chuông để cung cấp cho nó (cũng trong số @SpringBootApplication lớp được chú thích của bạn):

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

nếu tôi có một số bộ lọc được áp dụng, đơn hàng được chỉ định như thế nào? –

+0

'FilterRegistrationBean # setOrder (int)', tôi đã cập nhật câu trả lời. – mzc

+0

Cảm ơn, tôi sẽ kiểm tra điều này ngay bây giờ –

Các vấn đề liên quan