2016-01-30 72 views
11

Sto provando ad aggiungere intestazioni Cache-Control alle risposte generate in JBoss 7 usando il framework RESTEasy. Tuttavia, tutte le risposte finiscono per ottenere più intestazioni di Cache-Control a causa di JBoss che aggiunge un'intestazione no-cache per impostazione predefinita.JBoss7 impostazione Cache-Control, Pragma a no-cache per tutte le risposte da RESTEasy

Non riesco a trovare alcuna impostazione per rimuoverlo e l'aggiunta di intercettatori non funziona anche perché un'intestazione di no-cache viene aggiunta in seguito.

Qualcuno può dirmi come disabilitare il pragma predefinito e le intestazioni di controllo della cache in JBoss 7?

Nota: sto usando il restible con gli EJB stateless.

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

Ottenere le intestazioni di risposta come,

{ 
    "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" 
} 
+0

Scrivere un filtro. Rispondi alla risposta; e manipola le intestazioni che vuoi. – Abhin

+0

@Light Puoi dettagliarlo un po ', renderlo una risposta e segnare una taglia =) –

+0

Ho lo stesso problema con wildfly 10 (e sembra anche essere così in wildfly 8) dove c'è sempre anche il seguente regalo nell'intestazione della risposta: "Cache-Control: no-cache, no-store, must-revalidate". L'aggiunta dell'annotazione @Cache aggiunge solo un secondo campo di intestazione. Questo non può essere un comportamento corretto! Hai trovato una soluzione a questo problema? –

risposta

1

Una risorsa filtro in una web-app in pratica si richieste intercettare e risposta e soprattutto studiato per alcuni casi di utilizzo che funzionano alterando richiesta/risposta intestazioni lascia . Maggiori dettagli here

Poiché si utilizza RESTEasy è possibile utilizzare ContainerResponseFilter; un'interfaccia filtro fornita da JAX-RS. Puoi scrivere il tuo filtro personalizzato implementando questa interfaccia. La classe del filtro (aggiungerne uno al codice sorgente web app) sarà simile di seguito: -

@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"); 

    } 

} 

Qui fondamentalmente verificate per la prescense di intestazione Cache-Control e, se presente rimuovere quella esistente e aggiungere una delle proprio. Non dimenticare l'annotazione @Provider che è richiesta dal runtime jax rs per scoprire il tuo filtro personalizzato.

Nota che con questo filtro verranno intercettate tutte le richieste per la tua webapp. Se si desidera intercettare una determinata risorsa o un metodo di risorsa, è possibile esplorare l'uso di @NameBinding

Fammi sapere se funziona.

+0

Siamo spiacenti. Ma aggiungere un filtro non risolve il problema. L'unica intestazione trovata dal filtro è content-type che indica che JBOSS sta aggiungendo l'intestazione Pragma + Cache-Control dopo l'elaborazione del filtro di risposta. – Gary

+1

Sembra che ci sia una soluzione su https://access.redhat.com/solutions/28847 ma non ho l'abbonamento pagato per vederlo. – Gary

+0

Siamo spiacenti. Era lontano da SO per un paio di giorni. Puoi provare due cose: - 1) Prova ad aggiungere l'annotazione @BindingPriority (0) al tuo Filtro. 2) Passare al server.xml che si trova in Abhin