如何在 Spring Boot 中设置过滤器链?
Posted
技术标签:
【中文标题】如何在 Spring Boot 中设置过滤器链?【英文标题】:How to set up filter chain in spring boot? 【发布时间】:2016-11-09 15:34:11 【问题描述】:我遇到过spring-boot,打算为传入的请求添加一个过滤器链。
这是应用程序:
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 boot 中设置过滤器链。上面的代码有bug吗?
【问题讨论】:
您的代码有缺陷...您在第一个过滤器处停止/阻止请求,它永远不会通过。您需要拨打filterChain.doFilter(request, response)
继续通话...
【参考方案1】:
在 GreetingFilter 中添加以下代码行
filterChain.doFilter(servletRequest, servletResponse);
【讨论】:
【参考方案2】:我想进一步澄清一下 Gangadhar 的建议。您可以尝试添加:
filterChain.doFilter(servletRequest, servletResponse);
在过滤器类的 doFilter 方法中。这将创建过滤器的链接。
【讨论】:
以上是关于如何在 Spring Boot 中设置过滤器链?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中设置 enableLoggingRequestDetails='true'
如何在 Spring Boot 中设置 UTF-8 字符编码?