暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OncePerRequestFilter与Filter的区别

全栈的程序员 2022-07-26
4750


大家都知道Filter是过滤器,在一定的场景下会用到,但是你知道OncePerRequestFilter与Filter的区别么?为什么我们一般用OncePerRequestFilter而不用Filter ? 今天带着两个疑问进行下面的浏览。


一 过滤器的作用

过滤器可以再请求和响应之前做一部分预处理,有效的过滤掉不需要的内容,而且过滤器可以被复用,节省了大量的复用代码,提高了java的代码执行效率。


二 过滤器的应用场景

  1. 防止未登录就进入界面。

  2. 控制应用编码。

  3. 过滤敏感词汇等场景。

    三 为什么用 OncePerRequestFilter

Spring的OncePerRequestFilter类实际上是一个实现了Filter接口的抽象类。spring对Filter进行了一些封装处理。OncePerRequestFilter是在一次外部请求中只过滤一次。对于服务器内部之间的forward等请求,不会再次执行过滤方法。实现Filter接口,也会在一次请求中只过滤一次, 实际上,OncePerRequestFilter是为了兼容不同的web 容器,也就是说其实不是所有的容器都过滤一次。Servlet版本不同,执行的过程也不同。例如:在Servlet2.3中,Filter会过滤一切请求,包括服务器内部使用forward和<%@ include file=/login.jsp%>的情况,但是在servlet2.4中,Filter默认只会过滤外部请求。


四 总结


  1. OncePerRequestFilter与Filter 没有什么很大的区别,只是为了过滤请求从而实现特定的业务。需注意Servlet2.3版本的 Filter可以过滤所有请求。

  2. 建议使用 OncePerRequestFilter是一个比较稳妥的选择

  3. 多个过滤器可以使用  

    @Component+@Order()

来保证执行顺序。代码如下

    @Component
    @Order(1)
    @Slf4j
    public class FirstFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
    throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) servletRequest;
    log.info(
    "Starting a transaction for req : {}",
    req.getRequestURI());
    filterChain.doFilter(servletRequest, servletResponse);
    log.info(
    "Committing a transaction for req : {}",
    req.getRequestURI());
    }
    }


    @Component
    @Order(2)
    @Slf4j
    public class SecondFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
    throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) servletRequest;
    log.info(
    "Starting a transaction for req : {}",
    req.getRequestURI());
    filterChain.doFilter(servletRequest, servletResponse);
    log.info(
    "Committing a transaction for req : {}",
    req.getRequestURI());
    }
    }


    文章转载自全栈的程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论