Настройка 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.