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
废话短说