文档说org.springframework.web.filter.OncePerRequestFilter
" 保证每次请求只执行一次 ".在什么情况下,每个请求可能会多次执行过滤器?
Arm*_*man 18
要了解OncePerRequestFilter的作用,我们首先需要清楚地了解普通过滤器的行为方式.如果希望在servlet执行之前或之后执行某些特定代码,则可以创建一个过滤器,其工作方式如下:
code1 ===> servlet execution (using chain.doFilter()) ===> code2
Run Code Online (Sandbox Code Playgroud)
因此,在servlet执行之后,code1在servlet和code2之前执行.但是在这里,当servlet执行时,可能会有一些其他请求到不同的servlet,并且不同的servlet也有这个相同的过滤器.在这种情况下,此过滤器将再次执行.
OncePerRequestFilter可以防止此行为.对于我们的一个请求,此过滤器将只执行一次(不多也不少).使用安全身份验证时,此行为非常有用.
在什么情况下,每个请求可能会多次执行过滤器?
过滤器可以作为单独线程中发生的 REQUEST 或 ASYNC 调度的一部分来调用。我们应该使用 OncePerRequestFilter 因为我们正在执行数据库调用来检索主体或经过身份验证的用户,因此多次执行此操作没有意义。之后,我们将主体设置为安全上下文。
Authentication auth = jwtTokenProvider.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
Run Code Online (Sandbox Code Playgroud)
其中 jwtTokenProvider 是用于从 jwt 令牌获取身份验证的服务。
归档时间: |
|
查看次数: |
28097 次 |
最近记录: |