为什么多个类实现filter接口后会依次调用实现类里的doFilter方法?
普通的springboot项目,写了两个过滤器,访问接口后两个输出语句都能打印,filter是如何设计实现的?
@Componentpublic class XssFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//输出
System.out.println(this.getClass().getSimpleName());
ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest) {
requestWrapper = new XssHttpServletRequestWrapper((HttpServletRequest) request);
}
if (requestWrapper == null) {
chain.doFilter(request, response);
} else {
chain.doFilter(requestWrapper, response);
}
}
}
@Componentpublic class TestFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//输出
System.out.println(this.getClass().getSimpleName());
ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest) {
requestWrapper = new XssHttpServletRequestWrapper((HttpServletRequest) request);
}
if (requestWrapper == null) {
filterChain.doFilter(request, servletResponse);
} else {
filterChain.doFilter(requestWrapper, servletResponse);
}
}
}
我自己写了公共的接口,然后用两个类来实现,最后启动项目的时候找到了两个就报错了,如何实现filter中的功能的?是不是springboot扫描到实现了filter接口的类然后再调用对应的方法?
public interface CommonInterface { void test();
}
@Componentpublic class TestOne implements CommonInterface{
@Override
public void test() {
System.out.println(this.getClass().getSimpleName());
}
}
@Componentpublic class TestTwo implements CommonInterface{
@Override
public void test() {
System.out.println(this.getClass().getSimpleName());
}
}
@Componentpublic class StartTest implements CommandLineRunner {
@Resource
private CommonInterface commonInterface;
@Override
public void run(String... args) throws Exception {
commonInterface.test();
}
}
回答:
首先你的代码的问题在于使用@Resource注解注入一个bean却没有指定它的名称 所以它根据属性来查找bean找到了这两个同样为CommonInterface类型的bean,Spring不知道要注入哪一个所以报错了,
可以参照楼上使用@Qualifier的方式来指定是哪一个bean要注入。
但是你的题目似乎是想说想要实现类似filter这样的过滤器链顺序来执行你的两个类里的方法
请使用设计模式里的过滤器模式(也叫标准模式)来实现你的需求:
过滤器模式的示范
至于你说Spring里面是怎么实现filter里面的功能的,这涉及到源码,可以看一下下面的这篇文章:
filter的执行顺序解密
回答:
@Componentpublic class StartTest implements CommandLineRunner {
@Resource
@Qualifier("testOne")
private CommonInterface commonInterface;
@Override
public void run(String... args) throws Exception {
commonInterface.test();
}
}
@Component@Primary
public class TestOne implements CommonInterface{
@Override
public void test() {
System.out.println(this.getClass().getSimpleName());
}
}
以上是 为什么多个类实现filter接口后会依次调用实现类里的doFilter方法? 的全部内容, 来源链接: utcz.com/p/945167.html