带过滤器的Spring @Cacheable

时间:2015-03-24 13:43:36

标签: spring spring-mvc spring-security ehcache spring-cache

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

但是如果你想保持这样,它仍然可以通过以下方式起作用:

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

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