0

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

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

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

4

1 回答 1

5

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

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

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

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

但是,如果您想保持这种状态,它仍然可以通过以下方式工作:

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

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

于 2015-03-25T07:43:07.757 回答