【问题标题】:How to inject Cache-Control max-age header in Spring controller?如何在 Spring 控制器中注入 Cache-Control max-age 标头?
【发布时间】:2020-03-08 06:33:23
【问题描述】:

我在 Spring 控制器中有以下方法:

public Response myMethod (@PathVariable("id") String id,
        @RequestParam(required = false) Map<String, Object> queryString,
        @RequestHeader(value = HttpHeaders.ACCEPT, required = false) String acceptHeader,
        @RequestHeader(value = HttpHeaders.CACHE_CONTROL, required = false, defaultValue = 1) String expiration,
        @RequestHeader(value = HttpHeaders.FROM) String appId) {
// ...
}

在这里,我使用@RequestHeader 提取整个缓存控制标头。有没有办法只通过注入或使用专用 Spring 类进一步解析来获取 max-age 部分?还是我必须手动完成?

谢谢

【问题讨论】:

  • 我很惊讶没有找到请求缓存控制标头的解析器。 RFC 7234 允许指令的任何顺序、不区分大小写和可能引用。不是你想在每个项目中自己解析的东西。

标签: java spring spring-mvc http-headers


【解决方案1】:

你大概可以定义一个类,例如:CacheControlMaxAge,然后是Converter&lt;HttpRequest, CacheControlMaxAge&gt;,最后声明你的参数为 CacheControlMaxAge

@Getter
@RequiredArgsConstructor
public class CacheControlMaxAge {
  private final int maxAge;
}

@Component
public class CacheControlMaxAgeConverter implements Converter<HttpRequest, CacheControlMaxAge> {

  public CacheControlMaxAge convert(HttpRequest request) {
    // todo: extract stuff from request
    return new CacheControlMaxAge(...);
  }
}

public Response blah(..., CacheControlMaxAge cacheControl) { ... }

【讨论】:

  • 是的,我想通了,但我想在构建自己的解决方案之前检查是否有现成可用的东西
  • 我不知道 Spring(或 Boot)中有什么可以专门处理这个问题。可能已经存在更好的表示,例如org.springframework.http.CacheControl,但我没有看到任何可以专门启用它作为参数的表示(例如:我现在刚看时没有发现转换器)
猜你喜欢
  • 2015-04-08
  • 2011-12-08
  • 2020-08-11
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多