Настройка Cache-Control для нескольких конечных точек RestController в Spring - PullRequest
0 голосов
/ 01 мая 2018

У меня есть конечная точка Api с Spring 5 как @RestController, и я хочу указать Cache-Control для всех конечных точек одновременно (через Config или Аннотация, ...).

В настоящее время я делаю это для каждого метода. Мне также пришлось использовать ResponseEntity для установки Cache-Control, который еще больше раздувает код.

@RestController
@RequestMapping("/api")
public class MyApi {

    @PostMapping("/search")
    public ResponseEntity<SearchResultDto> search(SearchDto searchDto) {
        // ...
        return ResponseEntity.ok()
                .cacheControl(CacheControl.maxAge(20, TimeUnit.SECONDS))
                .body(searchResultDto);
    }

    @GetMapping("/get")
    public ResponseEntity<EntityDto> get(Long id) {
        // ...
        return ResponseEntity.ok()
                .cacheControl(CacheControl.maxAge(20, TimeUnit.SECONDS))
                .body(entityDto);
    }

    // ... more methods

}
  • Я попробовал Аспекты, но невозможно изменить заголовки http после их создания.
@Aspect
@Component
public class CacheAspect {

    @Pointcut("within(io.company.MyApi)")
    public void apiMethods() {
    }

    @Around("apiMethods()")
    public Object addCacheControlOnResponseEntity(ProceedingJoinPoint pjp) throws Throwable {
        Object retval = pjp.proceed();

        if (retval instanceof ResponseEntity) {
            ((ResponseEntity) retval).getHeaders().setCacheControl(CacheControl.maxAge(15, TimeUnit.SECONDS));
            // exception is thrown, because map can not be modified anymore
        }

        return retval;
    }
}
  • Я пробовал перехватчики (HandlerInterceptor), но здесь та же проблема, что заголовки http не могут быть изменены впоследствии.
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
                response.setHeader(HttpHeaders.CACHE_CONTROL, CacheControl.maxAge(2, TimeUnit.SECONDS).getHeaderValue());
                // header does not get modified
            }

            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
                response.setHeader(HttpHeaders.CACHE_CONTROL, CacheControl.maxAge(2, TimeUnit.SECONDS).getHeaderValue());
                // header does not get modified
            }
        });
    }
}
  • Я попытался добавить обработчик ресурсов (ResourceHandler) (для обычно статического содержимого) и установить стратегию кэширования для / api / **, но он не был применен.
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/api/**")
                .setCacheControl(CacheControl.maxAge(10, TimeUnit.SECONDS));
        // didn't had any effect
    }
}

... У меня нет идей

Что я могу сделать, чтобы написать меньше дубликатов / шаблонных кодов?

...