每个实体类都有user.id值,我对所有服务都有过滤器,这些服务通过principal.id和实体user.id过滤数据,只需添加where子句 . 我开始使用@Cacheable spring选项 . 但过滤器不适用于spring-cache . 如何从缓存中过滤数据?
@Override
@Cacheable(value = "countries")
public List<Country> getAll() {
return countryDao.findAll();
}
如果值在缓存中,则不同的用户可以访问其他用户的值 .
1 回答
从文档“顾名思义,@ Cacheable用于划分可缓存的方法 - 也就是说,结果存储到缓存中的方法,以便在后续调用(具有相同的参数)时,返回缓存中的值无需实际执行该方法 . “
在你的情况下你没有参数,因此每次调用getAll时它都会返回缓存版本 .
如果您的countryDao.findAll()在数据库级别注入userid,则会出现问题,因为调用countryDao.findAll()的第一个用户将导致其结果被缓存,因此其他用户将获得第一个用户的相同结果 .
通常,如果我理解您是如何设计服务的,那么通常不会在db级别注入用户,而是在服务级别传递它,以便将其与当前会话(例如Web请求)分离 .
但是,如果你想保持这样,它仍然可以通过以下方式工作:
所有你需要做的就是将用户传递给方法,即使你没有明确地使用它(但是缓存会) .