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)
如果值在缓存中,不同的用户可以访问其他用户的值。
来自文档“顾名思义,@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)
您所要做的就是将用户传递给该方法,即使您没有明确使用它(但缓存会)。
| 归档时间: |
|
| 查看次数: |
1624 次 |
| 最近记录: |