【问题标题】:How to set up filter chain in spring boot?如何在 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) 继续通话...

标签: java spring spring-boot servlet-filters


【解决方案1】:

在 GreetingFilter 中添加以下代码行

filterChain.doFilter(servletRequest, servletResponse);

【讨论】:

    【解决方案2】:

    我想进一步澄清一下 Gangadhar 的建议。您可以尝试添加:

    filterChain.doFilter(servletRequest, servletResponse);

    在过滤器类的 doFilter 方法中。这将创建过滤器的链接。

    【讨论】:

      猜你喜欢
      • 2017-02-21
      • 2021-09-09
      • 2013-11-18
      • 1970-01-01
      • 2023-03-15
      • 2015-05-22
      • 1970-01-01
      相关资源
      最近更新 更多