Настройка JBoss7 Cache-Control, Pragma без кэша для всех ответов от RESTEasy

Я пытаюсь добавить заголовки Cache-Control к ответам, сгенерированным в JBoss 7, с использованием среды RESTEasy. Тем не менее, все ответы в конечном итоге получают несколько заголовков Cache-Control из-за того, что JBoss по умолчанию добавляет заголовок без кэша.

Я не могу найти какие-либо настройки для его удаления, а добавление перехватчиков также не работает, поскольку позже добавляется заголовок no-cache.

Может ли кто-нибудь сказать мне, как отключить заголовки прагмы и кеша по умолчанию в JBoss 7?

Примечание. Я использую resteasy с помощью Ecl-адресов Stateless.

@Path("/api")
@Local
public interface UCSRestServiceInterface
{
    @GET
    @Path("/token")
    @Produces("application/json")
    @Cache(maxAge = 3600, noTransform = true)
    public Response getToken();
}

Получение заголовков ответов как,

{
  "pragma": "No-cache",
  "date": "Thu, 11 Feb 2016 20:16:30 GMT",
  "content-encoding": "gzip",
  "server": "Apache-Coyote/1.1",
  "x-frame-options": "SAMEORIGIN",
  "vary": "Accept-Encoding,User-Agent",
  "content-type": "application/json",
  "cache-control": "no-cache, no-transform, max-age=3600",
  "transfer-encoding": "chunked",
  "connection": "Keep-Alive",
  "keep-alive": "timeout=15, max=100",
  "expires": "Wed, 31 Dec 1969 19:00:00 EST"
}

Ответ 1

Ресурс фильтра в веб-приложении в основном позволяет перехватывать запросы и ответы и в основном предназначенные для некоторых случаев использования, которые работают путем изменения заголовков запросов/ответов. Подробнее здесь

Поскольку вы используете RESTEasy, вы можете использовать ContainerResponseFilter; интерфейс фильтра, предоставляемый JAX-RS. Вы можете написать свой собственный фильтр, реализовав этот интерфейс. Класс фильтра (добавьте его в исходный код веб-приложения) будет выглядеть следующим образом: -

@Provider
public class YourCustomFilter implements ContainerResponseFilter{

// you can check the actual string value by using method "getStringHeaders" on 'resp' below
private static final String CACHE_CONTROL = "cache-control";

@Override
public void filter(ContainerRequestContext req,
        ContainerResponseContext resp) throws IOException {

    if(resp.getHeaders().containsKey(CACHE_CONTROL)){
       resp.getHeaders().remove(CACHE_CONTROL);
       resp.getHeaders().add(CACHE_CONTROL, "no-transform, max-age=3600");
    }
    resp.getHeaders().add(CACHE_CONTROL, "no-transform, max-age=3600");

  }

}

Здесь вы в основном проверяете предварительный просмотр заголовка Cache-Control, а если присутствуете, удалите существующий и добавьте один из своих. Пожалуйста, не забывайте аннотацию @Provider, которая необходима во время выполнения jax rs, чтобы обнаружить ваш настраиваемый фильтр.

Обратите внимание, что с этим фильтром все запросы к вашему webapp будут перехвачены. Если вы хотите перехватить определенный ресурс или метод ресурсов, вы можете изучить использование @NameBinding

Сообщите мне, если это работает.

Ответ 2

Я нашел этот обходной путь, заключающийся в установке пустого значения для заголовка Pragma, когда заголовок "Cache-Control" присутствует, а "no-cache" отсутствует

import javax.annotation.Priority;
import javax.ws.rs.Priorities;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

@Priority(Priorities.HEADER_DECORATOR - 1)
@Provider
public class PragmaRemover implements ContainerResponseFilter {

    private static final String PRAGMA = "Pragma";

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        if(headers.containsKey(HttpHeaders.CACHE_CONTROL)){
            for (Object header : headers.get(HttpHeaders.CACHE_CONTROL)) {
                CacheControl cacheControl = (CacheControl) header;
                if(!cacheControl.isNoCache()){
                    headers.add(PRAGMA, "");
                }
            }
        }
    }
}

Priorities.HEADER_DECORATOR - 1 должен быть уверен, что заголовок кэша был установлен resteasy.

И не забудьте добавить этот фильтр в ваше приложение Jax-Rs.