我通过添加以下类将缓存控制添加到端点响应中:
@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/*">都具有相同的缓存控制标头,则此方法可以正常工作。但是,现在我们有一个要求,说不同的人将有不同的最大年龄(例如/person/1是300,/person/2是1000(。顺便说一句,此要求是由于分布式缓存对不同人员具有不同的到期时间。如何存档?
检索人员时,人员服务类将具有最大期限值。我可以将 maxAge 属性添加到 CacheControlInterceptor 中,该属性将在 PersonService 中自动连接吗?然后我可以在preHandle(...(中将其设置为HttpServletResponse。只是担心 CacheControlInterceptor 是单例的,它是否适用于多个请求?
我能想到的另一种方法是在 HttpServletRequest 中设置一个 maxAge 属性,然后 CacheControlInterceptor 可以使用该属性。但是如何将其从PersonService公开到RestMapping处理程序方法呢?
由于您的max-age
因人而异,因此我说在实际加载Person
后,将所有常见的Cache-Control
说明保留在您的Intercepter
中,并在服务中添加max-age
值。如下所示:
@RequestMapping("/person/{id}")
public void showPerson(@PathVaribale Long id, HttpServletResponse response) {
Person person = ...; // load the person from somewhere
String currentCacheControl = response.getHeader("Cache-Control");
if (currentCacheControl == null) currentCacheControl = "";
response.setHeader("Cache-Control", currentCacheControl + "max-age=" + person.getMaxAge());
}