【问题标题】:Spring Boot dynamic Cache Control header for different end points不同端点的 Spring Boot 动态缓存控制标头
【发布时间】: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/*" 都具有相同的缓存控制标头,则此方法可以正常工作。但是,现在我们有一个要求,即不同的人将有不同的 ma​​x-age(例如 /person/1 是 300 和 /person/2 是 1000)。顺便说一句,这个要求是由于分布式缓存对于不同的人员有不同的到期时间。如何存档?

PersonService 类在检索人员时将具有 ma​​x-age 值。 我可以向 CacheControlInterceptor 添加一个 ma​​xAge 属性,该属性将在 PersonService 中自动装配吗?然后我可以在 preHandle(...) 中将其设置为 HttpServletResponse。只是担心 CacheControlInterceptor 是单例的,它是否适用于多个请求?

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

【问题讨论】:

    标签: spring spring-mvc spring-boot


    【解决方案1】:

    由于您的max-age 因人而异,我说在您实际加载Person 之后,在您的Intercepter 中保留所有常见的Cache-Control 指令并在服务中添加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());
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 2020-07-17
      • 2017-01-01
      • 1970-01-01
      • 2011-01-13
      • 2016-04-26
      • 1970-01-01
      • 2020-07-23
      相关资源
      最近更新 更多