How to set up filter-Kette in den Frühling starten?
Ich bin gekommen, über spring-boot und wollen zum hinzufügen einer Filterkette für einen eingehenden request.
Hier 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 starten Sie die Anwendung und führen Sie curl localhost:8080/greeting
Nur "Grüße aus dem filter" empfangen wird, und die HelloFilter
wird nicht aufgerufen.
Außerdem gibt es keine Antwort von Greeting Controller
. Es scheint, dass die GreetingFilter
blockiert das Verfahren.
So, wie zu der filter-Kette in den Frühling starten. Gibt es irgendwelche bugs in dem code oben?
- Dein code ist fehlerhaft... Sie stop/block te Anfrage an das erste filter wird es auch nie weitergeben. Müssen Sie rufen Sie
filterChain.doFilter(request, response)
zu gehen nennen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen folgender code-Zeile in GreetingFilter funktioniert
Ich möchte nur klarstellen, ein wenig mehr auf das, was Gangadhar vorgeschlagen. Sie können versuchen, hinzufügen :
filterChain.doFilter(servletRequest, servletResponse);
in der doFilter Methode des filter-Klassen.Dadurch wird die Verkettung der Filter.