5

spring-boot uygulamasına sahibim.Yay uygulamasında servlet filtrelerinde fasülyeyi nasıl fileye almak için?

Projemde ApplicationContext.xml veya web.xml dosya yok. Onlardan kaçınmayı ve Java kodunda yapılandırılmış herşeyi yapmayı tercih ederim.

Servlet filtrelerinde fasülye enjeksiyonu ile ilgili aşağıdaki yazıları okudum.

  • spring injection in servlet filter

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

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

    1. bunları okuduktan sonra DelegatingFilterProxy kullanmaya başladı.

      Sorum, Bean'i autowire çekirdeğidir ve özellikle DelegatingFilterProxy yapılandırması için xml dosyalarını kullanmaktan kaçınır.

      snipped kod 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> 
      

    cevap

    6

    barındırılan ikinci mesaja edinilebilir sadece ana uygulama sınıfı (@SpringBootApplication ile açıklamalı sınıfı) bir FilterRegistrationBean ekleyebilir ve Bahar AuditHandler örneğini sunalım olmalıdır:

    @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; 
    } 
    

    Eğer bu işe yaramazsa (örneğin, AuditHandler uygulamanız doğru şekilde açıklanmamış veya varsayılan paket tarama yolunda değil) Sp halka (sizin @SpringBootApplication açıklamalı sınıfta da) bunu sağlamak için:

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

    ben uygulanacak filtrelerin bir dizi varsa, nasıl emir belirtilir? –

    +0

    'FilterRegistrationBean # setOrder (int)', Cevabı güncelledim. – mzc

    +0

    Teşekkürler, şimdi bunu test edeceğim –

    İlgili konular