2016-07-07 20 views
9

Natknąłem się na wiosenny rozruch i zamierzam dodać łańcuch filtrów dla przychodzących żądań.Jak ustawić łańcuch filtrów w rozruchu sprężynowym?

Oto Zastosowanie:

package example.hello; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.ApplicationContext; 

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 
    } 

} 

Oto Kontroler:

package example.hello; 

import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

import java.util.concurrent.atomic.AtomicLong; 

@RestController 
public class GreetingController { 

    private static final String template = "Hello, %s!"; 
    private final AtomicLong counter = new AtomicLong(); 

    @RequestMapping("/greeting") 
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { 
     return new Greeting(counter.incrementAndGet(), 
       String.format(template, name)); 
    } 
} 

Oto Filter Config:

package example.hello; 

import org.springframework.boot.context.embedded.FilterRegistrationBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class WebConfig { 

    @Bean 
    public FilterRegistrationBean greetingFilterRegistrationBean() { 
     FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
     registrationBean.setName("greeting"); 
     GreetingFilter greetingFilter = new GreetingFilter(); 
     registrationBean.setFilter(greetingFilter); 
     registrationBean.setOrder(1); 
     return registrationBean; 
    } 

    @Bean 
    public FilterRegistrationBean helloFilterRegistrationBean() { 
     FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
     registrationBean.setName("hello"); 
     HelloFilter helloFilter = new HelloFilter(); 
     registrationBean.setFilter(helloFilter); 
     registrationBean.setOrder(2); 
     return registrationBean; 
    } 

} 

Oto Filtr HelloFilter i życzeniami:

package example.hello; 

import javax.servlet.*; 
import java.io.IOException; 

public class HelloFilter implements Filter { 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     System.out.println("HelloFilter!"); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

package example.hello; 

import javax.servlet.*; 
import java.io.IOException; 

public class GreetingFilter implements Filter { 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     System.out.println("Greetings from filter!"); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

Po uruchomieniu aplikacji i uruchomieniu curl localhost:8080/greeting, tylko "Pozdrowienia z filtra" są odbierane, a HelloFilter nie jest wywoływana.

Oprócz tego nie ma odpowiedzi od Greeting Controller. Wygląda na to, że GreetingFilter blokuje procedurę.

Jak ustawić łańcuch filtrów podczas rozruchu wiosennego. Czy są jakieś błędy w powyższym kodzie?

+5

Twój kod jest błędny ... Zatrzymujesz/blokujesz te żądanie przy pierwszym filtrze, którego nigdy nie przejdzie. Musisz wywołać 'filterChain.doFilter (request, response)', aby kontynuować połączenie ... –

Odpowiedz

8

Dodawanie następujący wiersz kodu w GreetingFilter działa

filterChain.doFilter(servletRequest, servletResponse); 
1

Chciałbym tylko wyjaśnić, trochę bardziej na tym, co sugeruje Gangadhar. Możesz spróbować dodać:

filterChain.doFilter (servletRequest, servletResponse);

w metodzie doFiltracji klas filtrów. Spowoduje to utworzenie łańcuchów filtrów.