J'ai rencontré Spring-Boot et j'ai l'intention d'ajouter une chaîne de filtrage pour les demandes entrantes.
Voici l'application:
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);
}
}
Voici le contrôleur:
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));
}
}
Voici la configuration du filtre:
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;
}
}
Voici le filtre HelloFilter et Greeting:
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() {
}
}
Lorsque je démarre l'application et que j'exécute curl localhost:8080/greeting
, Seuls les "messages d'accueil du filtre" sont reçus et le HelloFilter
n'est pas appelé.
D'ailleurs il n'y a pas de réponse de Greeting Controller
. Il semble que le GreetingFilter
bloque la procédure.
Alors, comment définir la chaîne de filtres dans Spring Boot. Y a-t-il des bogues dans le code ci-dessus?
Ajout de la ligne de code suivante dans les œuvres de GreetingFilter
filterChain.doFilter(servletRequest, servletResponse);
Je voudrais juste clarifier un peu plus ce que Gangadhar a suggéré. Vous pouvez essayer d'ajouter:
filterChain.doFilter (servletRequest, servletResponse);
dans la méthode doFilter de vos classes de filtres. Cela créera le chaînage des filtres.