OncePerRequestFilter是什么
OncePerRequestFilter是Spring框架提供的一个过滤器,确保在一次HTTP请求期间只执行一次特定的过滤器逻辑。它继承了GenericFilterBean类,并实现了javax.servlet.Filter接口。在Spring框架中,过滤器是一种拦截器,用于在请求到达目标资源之前或之后执行一些操作。OncePerRequestFilter是一种特殊的过滤器,确保在一次请求中只执行一次过滤器的逻辑。
OncePerRequestFilter跟普通Filter的最大区别就是执行次数,OncePerRequestFilter可以确保在一次HTTP请求期间只执行一次特定的过滤器,避免过滤器多次执行的问题。
servlet filter 为啥会多次执行
在servlet2.3中,Filter会经过一切请求,包括服务器内部使用的forward转发请求和<%@ include file=”/login.jsp”%>
的情况
servlet2.4中的Filter默认情况下只过滤外部提交的请求,forward和include这些内部转发都不会被过滤
OncePerRequestFilter使用
使用OncePerRequestFilter,创建一个类继承OncePerRequestFilter,然后注册到spring即可
//order表示优先级,数字越小,优先级越高
@Order(0)
@Component
public class MyFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
//执行你的过滤逻辑
System.out.println("执行过滤逻辑");
// 继续处理请求
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
/**
* 可以过滤一些不需要过滤的请求
* @return
*/
@Override
protected boolean shouldNotFilterAsyncDispatch() {
return super.shouldNotFilterAsyncDispatch();
}
}
注册过滤器的方式
1、Filter 实现类 + @WebFilter + 启动类添加@ServletComponentScan:正常urlpattern的Filter
2、Filter 实现类 + FilterRegistrationBean构造 + @Configuration:正常urlpattern的Filter,并且可以设置Order
3、仅仅 Filter实现类 + @Component :会注册一个urlpattern 为 /*的过滤器
onceperrequestfilter的应用场景
onceperrequestfilter的应用场景比较广泛,但主要是为了有效地控制过滤器的执行次数,对程序性能优化有很好的作用。
举个例子,在Web开发中,我们经常使用过滤器来实现一些通用的控制功能,例如登录验证、权限认证、字符编码转换等。但是,如果每次请求都执行这些过滤器,无论是否需要,都会浪费一定的资源和时间。通过使用onceperrequestfilter,我们可以实现过滤器在同一次请求中只执行一次的效果,提高程序性能。