不同端点的 Spring 引导动态缓存控制标头



我通过添加以下类将缓存控制添加到端点响应中:

@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());
}

最新更新