【问题标题】:return after call doFilter() of GenericFilterBean on Spring Boot在 Spring Boot 上调用 GenericFilterBean 的 doFilter() 后返回
【发布时间】:2019-06-28 13:46:16
【问题描述】:

我在我的 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-boot spring-mvc spring-security filter servlet-filters


    【解决方案1】:

    您的代码将始终调用 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
    
            }
    
        }
    

    但是你的代码总是执行 next 过滤器然后就完成了。 您的代码很好,但您可以使用 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();
    
            }
    
        }
    

    【讨论】:

    • 调用return没问题,但这是很多人不喜欢的风格。它会正常工作,这意味着:1. 调用下一个过滤器 2. 退出当前方法
    猜你喜欢
    • 2020-06-26
    • 2018-08-26
    • 2014-11-14
    • 2018-06-19
    • 1970-01-01
    • 2016-05-16
    • 2018-10-17
    • 2023-02-01
    • 2013-01-01
    相关资源
    最近更新 更多