【问题标题】:Spring security filter single call to DatabaseSpring 安全过滤器对数据库的单个调用
【发布时间】: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.sendRedirectrequestDispatcher.forward,那么只会调用一次过滤器,即当第一个请求到达时。而且,那是因为您将 OncePerRequestFilter 作为父级。你还需要什么?
  • 如果这个布尔值dbService.getNeeded 的响应对于所有请求都相同,那么为什么不创建一个单例类并在那里初始化它并直接从该类引用它的值或将其作为静态过滤器的属性。
  • @Ashish 我怎样才能使它成为静态属性?

标签: java spring spring-mvc spring-security


【解决方案1】:

我的建议是在 application.properties 文件而不是 DBService 中设置 isNeeded 的值。这样,在整个应用程序运行之前,它始终是一个单一值。

您可以在过滤器中使用@Value 注释,并在 src/main/resources/application.properties 中有一个值:

application.properties

isNeeded=true

使用@Value 注释更新代码

public class MyFilter extends OncePerRequestFilter {
    @Value("${isNeeded}")
    private boolean isNeeded;

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
         
         if (isNeeded) {
               // do something
         }
    }

}

还有其他选项可以从其他属性文件中读取属性。 在这里阅读:

How to read data from java properties file using Spring Boot

【讨论】:

猜你喜欢
  • 2015-05-24
  • 2015-04-01
  • 2015-05-30
  • 1970-01-01
  • 2016-05-07
  • 2022-08-05
  • 1970-01-01
  • 2020-12-05
  • 2017-02-03
相关资源
最近更新 更多