【发布时间】:2022-01-27 17:21:37
【问题描述】:
我在 Spring Boot (v2.4) 中有一个注释为 @RestController 的控制器。默认情况下,这应该为它处理的所有端点返回一个具有完全静态配置的 HTTP 标头“Cache-Control”。
到目前为止,我通过控制器类中的 @ModelAttribute 注释方法实现了这一点,该方法只需像这样设置标题:
@ModelAttribute
public void setResponseHeader(HttpServletResponse response) {
response.setHeader(HttpHeaders.CACHE_CONTROL,
CacheControl.maxAge(1, TimeUnit.DAYS).cachePrivate().getHeaderValue());
}
这很好用,但我发现它与我的异常处理程序发生了一点冲突——我通过将@RestControllerAdvice 放到另一个类上配置了一个全局处理程序,然后为内部各种可能的异常设置了多个用@ExceptionHandler 注释的方法.
大多数时候异常处理程序设置一个特定的 HTTP 状态为 400 及以上,当然我不希望它被缓存。
即使我在异常处理方法中提供了HttpServletResponse,我的setResponseHeader(HttpServletResponse) 方法已经在其中设置了HTTP 标头,并且接口HttpServletResponse 不允许我再次删除它们。
那么有什么策略可以让默认的缓存标头在一侧,而异常处理程序的异常在另一侧?
如果我不必在每个端点的控制器方法中单独设置缓存标头,我将不胜感激。
另外的挑战是,我需要将大数据流式传输到客户端,所以我真的很想避免服务器端缓存,因为我预计会有很多请求,并希望防止服务器用应该的内容填充它的堆交付给客户。 不幸的是,我不能使用普通资源处理程序机制,因为我不想放入过滤器中需要有关权限(不仅是 OAuth2,还有许可)的复杂查询。
【问题讨论】:
标签: java spring-boot rest exception response-headers