简体   繁体   English

如何在弹簧靴中设置过滤链?

[英]How to set up filter chain in spring boot?

I have come across spring-boot and intend to add a filter chain for incoming request. 我遇到了spring-boot,并打算为传入请求添加一个过滤器链。

Here is the 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);
    }

}

Here is the 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));
    }
}

Here is the 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;
    }

}

Here is the HelloFilter and Greeting Filter: 这是HelloFilter和问候过滤器:

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() {

    }
}

When I start the application and run curl localhost:8080/greeting , Only "Greetings from filter" is received and the HelloFilter is not invoked. 当我启动应用程序并运行curl localhost:8080/greeting ,仅收到“来自过滤器的问候语”,并且不调用HelloFilter

Besides there is no response from Greeting Controller . 此外, Greeting Controller没有回应。 It seems that the GreetingFilter blocks the procedure. 似乎GreetingFilter阻止了该过程。

So how to set the filter chain in Spring boot. 那么如何在Spring启动时设置过滤器链。 Are there any bugs in the code above? 上面的代码中是否有任何错误?

在GreetingFilter中添加以下代码行

filterChain.doFilter(servletRequest, servletResponse);

I would just like to clarify a little more on what Gangadhar suggested. 我想更多地澄清一下Gangadhar建议的内容。 You can try adding : 您可以尝试添加:

filterChain.doFilter(servletRequest, servletResponse); filterChain.doFilter(servletRequest,servletResponse);

in doFilter method of your filter classes.This will create chaining of the filters. 在过滤器类的doFilter方法中。这将创建过滤器的链接。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM