Solo  当前访客:1 开始使用


OncePerRequestFilter 过滤器

是什么

实现了javax.servlet.Filter原生接口的抽象类。OncePerRequestFilter可以保证一次外部请求,只执行一次过滤方法,对于服务器内部之间的forward、异步请求等动作,不会再次执行过滤方法

原因:

forward、异步请求由于执行原理的限制,其会导致请求多次进入其他的servlet或者同一个servlet,为了避免客户端的发布的一个请求被多次执行过滤器,要继承OncePerRequestFilter过滤器,利用其 shouldNotFilterAsyncDispatch方法限制执行多次过滤器

使用场景

OncePerRequestFilter的主要目的是为了兼容不同的WEB容器,因为Servlet版本不同,执行的过程也不同,其实不是所有的容器一次请求只过滤一次。

使用方法

自定义过滤器并继承 OncePerRequestFilter ,重写 doFilterInternal 方法

分析

OncePerRequestFilter 的 shouldNotFilterAsyncDispatch 方法默认返回 true,意味着默认在异步请求中不重复进入该过滤器,如果要根据具体情况修改true 或者 false ,重写该方法即可

为什么异步请求会多次进入过滤器

这与异步请求的生命周期有关

异步请求的例子

@WebServlet(urlPatterns = "/async")

public class AsyncServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    // 将请求变为异步请求
    AsyncContext asyncContext = request.startAsync();

    // 在另一个线程中执行业务逻辑
    new Thread(() -> {
        try {
            // 模拟耗时操作
            Thread.sleep(1000);

            // 将结果写入响应
            asyncContext.getResponse().getWriter().write("Hello, world!");

            // 结束异步请求
            asyncContext.complete();
        } catch (Exception e) {
            e.printStackTrace();
            asyncContext.complete();
        }
    }).start();
}

}


标题:OncePerRequestFilter 过滤器
作者:temp12138
地址:https://solo.mfyzl.icu/articles/2024/03/13/1710341832159.html

标签:
新一篇: Servlet 重复读取 HttpServletRequest 中的请求体 旧一篇: 在 HTTP 请求中,Content-Type