OncePerRequestFilter详解

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,我们可以实现过滤器在同一次请求中只执行一次的效果,提高程序性能。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OncePerRequestFilter无法注入的原因可能是因为它是一个抽象类,无法直接被实例化和注入。引用中提到,OncePerRequestFilter通常被用于继承实现并在每次请求时只执行一次过滤。所以,您需要创建一个实现OncePerRequestFilter的具体子类,并在该子类中实现自己的过滤逻辑。然后,将该子类注入到您的应用程序中,以便在每次请求时执行该过滤器的逻辑。 如果您正在使用Spring BootSpring Security,可以使用@Configuration注解创建一个配置类,并使用@Bean注解将您的过滤器实例化并注入到应用程序中。然后,Spring Boot将会自动将该过滤器添加到过滤器链中,并在每次请求时执行该过滤器的逻辑。请确保在配置类中正确设置过滤器的顺序。 总结来说,OncePerRequestFilter无法直接注入,您需要创建一个实现OncePerRequestFilter的子类,并将其注入到您的应用程序中。这样,您就可以在每次请求时执行该过滤器的逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [OncePerRequestFilter 详解](https://blog.csdn.net/qq_24910693/article/details/119926429)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值