私は春のブートに出くわし、着信要求のフィルターチェーンを追加するつもりです。
アプリケーションは次のとおりです。
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);
}
}
コントローラーは次のとおりです。
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));
}
}
これがフィルター構成です:
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;
}
}
HelloFilterとGreeting 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() {
}
}
アプリケーションを起動してcurl localhost:8080/greeting
を実行すると、「フィルターからのご挨拶」のみが受信され、HelloFilter
は呼び出されません。
Greeting Controller
からの応答がありません。 GreetingFilter
がプロシージャをブロックしているようです。
それでは、Springブートでフィルターチェーンを設定する方法。上記のコードにバグはありますか?
GreetingFilterで次のコード行を追加する
filterChain.doFilter(servletRequest, servletResponse);
ガンガダールが提案したことをもう少し明確にしたいと思います。追加を試すことができます:
filterChain.doFilter(servletRequest、servletResponse);
フィルタークラスのdoFilterメソッド。これにより、フィルターのチェーンが作成されます。