每个实体类都有user.id值,我在所有服务上都有过滤器,它在数据库级别上根据principal.id和实体user.id过滤数据,只需添加where子句。我开始使用@Cacheable spring选项。但是过滤器不能与spring-cache一起工作。如何从缓存中过滤数据?
@Override
@Cacheable(value = "countries")
public List<Country> getAll() {
return countryDao.findAll();
}如果值在缓存中,则不同的用户可以访问其他用户的值。
发布于 2015-03-25 15:43:08
从文档“顾名思义,@Cacheable用于划分可缓存的方法--即,将结果存储到缓存中的方法,以便在后续调用(使用相同的参数)时,返回缓存中的值,而不必实际执行该方法。”
在本例中,您没有参数,因此每次调用getAll时,它都会返回缓存的版本。
如果您的countryDao.findAll()在数据库级别注入userid,您就会遇到一个问题,因为第一个调用countryDao.findAll()的用户将导致其结果被缓存,因此其他用户将获得与第一个用户相同的结果。
一般来说,如果我理解你是如何设计服务的,你通常不会在数据库级别注入用户,而是在服务级别传递它,这样这就与当前会话(例如web请求)解耦了。
然而,如果你想保持这样,它仍然可以通过执行以下操作来工作:
@Cacheable(value = "countries", key="#user.id")
public List<Country> getAll(User user) {
return countryDao.findAll();
}您所要做的就是将用户传递给该方法,即使您没有显式使用它(但缓存将显式使用)。
https://stackoverflow.com/questions/29234244
复制相似问题