首页 > 解决方案 > 在 Spring Boot 上调用 GenericFilterBean 的 doFilter() 后返回

问题描述

我在我的 Spring 引导项目中使用 GenericFilterBean 作为过滤器。

在某些情况下,我想在我的过滤器逻辑上传递下一个过滤器。

我的过滤器如下所示;

public class MyFilter extends GenericFilterBean {

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

            HttpServletRequest httpServletRequest = (HttpServletRequest) request;

            if (anyCondition){
                chain.doFilter();
                return;         
            }

            if (anyCondition){
                chain.doFilter();
                return;         
            }

            if (anyCondition){
                chain.doFilter();
                return;         
            }

            chain.doFilter();

        }

    }

如果我不返回,它会调用其他 chain.doFilter(),这就是我返回的方式。

在调用 chain.doFilter() 之后会导致返回任何问题吗?

这是处理这种情况的正确方法吗?

标签: spring-bootspring-mvcspring-securityfilterservlet-filters

解决方案


您的代码将始终调用chain.doFilter(不是 doChain)

例如

    public class MyFilter extends GenericFilterBean {

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

            HttpServletRequest httpServletRequest = (HttpServletRequest) request;

            //this gets executed before other filters
            some code here

            //now we execute other filters
            chain.doFilter(request, response); 

            //this code gets executed after the 'next' filters are done
            some code here

        }

    }

但是您的代码总是执行下一个过滤器然后完成。你的代码很好,但你可以用一个if then else语句来代替

    public class MyFilter extends GenericFilterBean {

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

            HttpServletRequest httpServletRequest = (HttpServletRequest) request;

            if (condition1){
                //do something for condition1
            } else if (condition2) {
                //do something for condition2
            }  else if (condition3) {
                //do something for condition3
            }
            chain.doChain();

        }

    }

推荐阅读