5

मेरे पास spring-boot एप्लिकेशन है।वसंत आवेदन में सर्वलेट फिल्टर में बीन को स्वचालित करने के लिए कैसे करें?

मेरे पास मेरे प्रोजेक्ट में ApplicationContext.xml या web.xml फ़ाइलें नहीं हैं। मैं उनसे बचना पसंद करता हूं और जावा कोड में सब कुछ कॉन्फ़िगर किया गया है।

मैंने सर्वलेट फ़िल्टर में बीन इंजेक्शन के बारे में निम्नलिखित पोस्ट पढ़ी हैं।

  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 उपयोग करने के लिए शुरू कर दिया।

मेरा प्रश्न है कि autowire फ़िल्टर में बीन कैसे करें और विशेष रूप से DelegatingFilterProxy कॉन्फ़िगरेशन के लिए xml फ़ाइलों का उपयोग करने से बचें।

कोड कतरना 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

में होस्ट दूसरे पोस्ट से उपलब्ध है कि आप अपनी मुख्य आवेदन वर्ग (कक्षा @SpringBootApplication साथ एनोटेट) के लिए एक FilterRegistrationBean जोड़ सकते हैं और स्प्रिंग 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

'फ़िल्टर पंजीकरण पंजीकरण # सेटऑर्डर (int) ', मैंने जवाब अपडेट किया है। – mzc

+0

धन्यवाद, मैं अब परीक्षण करूँगा –

संबंधित मुद्दे