【发布时间】:2016-05-25 07:08:34
【问题描述】:
我通过添加以下类将 Cache-Control 添加到端点响应:
@Component
public class CacheControlInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
return true;
}
}
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
HandlerInterceptor cacheControlInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CacheControlInterceptor()).addPathPatterns("/person/*");
}
}
如果所有 "/person/*" 都具有相同的缓存控制标头,则此方法可以正常工作。但是,现在我们有一个要求,即不同的人将有不同的 max-age(例如 /person/1 是 300 和 /person/2 是 1000)。顺便说一句,这个要求是由于分布式缓存对于不同的人员有不同的到期时间。如何存档?
PersonService 类在检索人员时将具有 max-age 值。 我可以向 CacheControlInterceptor 添加一个 maxAge 属性,该属性将在 PersonService 中自动装配吗?然后我可以在 preHandle(...) 中将其设置为 HttpServletResponse。只是担心 CacheControlInterceptor 是单例的,它是否适用于多个请求?
我能想到的另一种方法是在 HttpServletRequest 中设置一个 maxAge 属性,然后 CacheControlInterceptor 可以使用该属性。但是如何将它从 PersonService 暴露给 RestMapping 处理程序方法呢?
【问题讨论】:
标签: spring spring-mvc spring-boot