2016-07-07 25 views
9

Ich bin auf Spring-Boot gestoßen und beabsichtige, eine Filterkette für eingehende Anfrage hinzuzufügen. HierWie richte ich die Filterkette im Springboot ein?

ist die Anwendung:

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

} 

Hier ist der Controller:

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

Hier ist der 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; 
    } 

} 

Hier ist die HelloFilter und Gruß Filter:

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() { 

    } 
} 

Wenn ich die Anwendung starte und curl localhost:8080/greeting starte, wird nur "Greetings from filter" empfangen und die wird nicht aufgerufen.

Außerdem gibt es keine Antwort von Greeting Controller. Es scheint, dass die GreetingFilter den Vorgang blockiert.

So, wie Sie die Filterkette im Springboot einstellen. Gibt es Fehler im obigen Code?

+5

Ihr Code ist fehlerhaft ... Sie stoppen/blockieren die Anforderung beim ersten Filter, den sie niemals weitergeben wird. Sie müssen 'filterChain.doFilter (request, response)' aufrufen, um den Anruf fortzusetzen ... –

Antwort

8

folgende Codezeile in GreetingFilter arbeitet

filterChain.doFilter(servletRequest, servletResponse); 
1

Ich möchte nur auf ein wenig mehr zu klären, wie das Hinzufügen was Gangadhar vorgeschlagen. Sie können versuchen, hinzuzufügen:

filterChain.doFilter (servletRequest, servletResponse);

in DoFilter-Methode Ihrer Filterklassen.Dies wird eine Verkettung der Filter erstellen.