Spring @Cacheable 带过滤器

kxy*_*xyz 0 spring spring-mvc ehcache spring-security spring-cache

每个实体类都有 user.id 值,我在所有服务上都有过滤器,它们在数据库级别按 principal.id 和实体 user.id 过滤数据,只需添加 where 子句。我开始使用@Cacheable spring 选项。但是过滤器不适用于 spring-cache。如何从缓存中过滤数据?

@Override
@Cacheable(value = "countries")
public List<Country> getAll() {
    return countryDao.findAll();
}
Run Code Online (Sandbox Code Playgroud)

如果值在缓存中,不同的用户可以访问其他用户的值。

sel*_*rce 5

来自文档“顾名思义,@Cacheable 用于划分可缓存的方法 - 即,将结果存储到缓存中的方法,以便后续调用(使用相同的参数),返回缓存中的值无需实际执行该方法。”

在您的情况下,您没有参数,因此每次调用 getAll 时,它都会返回缓存版本。

如果您的 countryDao.findAll() 在数据库级别注入用户 ID,则会出现问题,因为第一个调用 countryDao.findAll() 的用户将导致他的结果被缓存,因此其他用户将获得与第一个用户相同的结果。

一般来说,如果我了解您如何设计服务,通常不会在 db 级别注入用户,而是在服务级别传递它,以便将其与当前会话(例如 Web 请求)分离。

但是,如果您想保持这种状态,它仍然可以通过执行以下操作:

@Cacheable(value = "countries", key="#user.id")
public List<Country> getAll(User user) {     
    return countryDao.findAll();
}
Run Code Online (Sandbox Code Playgroud)

您所要做的就是将用户传递给该方法,即使您没有明确使用它(但缓存会)。