OncePerRequestFilter确保在一次请求中只执行一次,难道不是所有过滤器都是每个请求只执行一次吗?
时间: 2024-05-16 20:19:52 浏览: 94
程序只能运行一次,防止程序重复执行。
4星 · 用户满意度95%
不是所有的过滤器都是在一次请求中只执行一次的,实际上Spring Security框架中的过滤器有两种类型:一种是基于`OncePerRequestFilter`实现的,另一种是基于`GenericFilterBean`实现的。
基于`OncePerRequestFilter`实现的过滤器在一次请求中只会执行一次,确保了过滤器中的操作不会重复执行,这是由于`OncePerRequestFilter`内部维护了一个ThreadLocal变量,用于标记当前请求是否已经被处理过。如果请求已经被处理过,则不会再次执行过滤器中的操作。
而基于`GenericFilterBean`实现的过滤器在每个请求中都会执行一次,如果在过滤器中执行一些重复的操作,则会导致性能的浪费。因此,如果需要在一次请求中只执行一次的操作,建议使用`OncePerRequestFilter`实现过滤器。
需要注意的是,`OncePerRequestFilter`只是一个抽象类,需要通过继承并重写`doFilterInternal`方法来实现具体的过滤器逻辑。此外,Spring Security框架还提供了一些内置的`OncePerRequestFilter`实现类,例如`CsrfFilter`、`SecurityContextHolderAwareRequestFilter`等,可以在需要的时候直接使用。
阅读全文