用于不同端点的Spring Boot动态高速缓存控制标头

时间:2016-02-14 11:40:30

标签: spring spring-mvc spring-boot

我已通过添加以下类将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 值。 我可以将 maxAge 属性添加到 CacheControlInterceptor ,该属性将在 PersonService 中自动加载吗?然后我可以在 preHandle(...)中将其设置为 HttpServletResponse 。只关心 CacheControlInterceptor 是单例,它是否适用于多个请求?

我能想到的另一种方法是在 HttpServletRequest 中设置 maxAge 属性,然后 CacheControlInterceptor 可以使用该属性。但是如何将它从 PersonService 暴露给RestMapping处理程序方法呢?

1 个答案:

答案 0 :(得分:0)

由于您FIRST earlier than LAST # Because 21 is less than 11PM (=23) FIRST later than LAST # Because 12 is greater than 10AM (=10) FIRST same as LAST # Because 23 is the same as 11PM (=23) 之间的人员不同,我说保留max-age中的所有常见Cache-Control说明,然后在服务中添加Intercepter值加载max-age。如下所示:

Person