【发布时间】:2021-08-31 23:02:14
【问题描述】:
我创建了一个过滤器,肯定会在每个请求中调用它。我有这个数据库调用:dbService.getNeeded()。如何只进行一次此调用并在整个过滤器调用中使用它?
public class MyFilter extends OncePerRequestFilter {
@Autowired
private DBService dbService;
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
boolean isNeeded = dbService.getNeeded();
if (isNeeded) {
// do something
}
}
}
【问题讨论】:
-
“整个调用过滤器”是什么意思?你想在所有请求中只调用一次吗?如果没有,问题是什么?
-
@Ashish 这个过滤器会在每个请求上被调用。这意味着我将在每个请求中调用
dbService.getNeeded()。我只想调用该方法一次。我该怎么做? -
你说每个请求都会调用
dbService.getNeeded,这肯定会。然后你说,只调用一次。你不觉得它自相矛盾的说法。即使您的过滤器再次执行,如果它是response.sendRedirect或requestDispatcher.forward,那么只会调用一次过滤器,即当第一个请求到达时。而且,那是因为您将 OncePerRequestFilter 作为父级。你还需要什么? -
如果这个布尔值
dbService.getNeeded的响应对于所有请求都相同,那么为什么不创建一个单例类并在那里初始化它并直接从该类引用它的值或将其作为静态过滤器的属性。 -
@Ashish 我怎样才能使它成为静态属性?
标签: java spring spring-mvc spring-security