2016-01-30 19 views
11

Ich versuche, Cache-Control-Header zu den Antworten in JBoss 7 mit dem Restasy-Framework hinzugefügt. Alle Antworten erhalten jedoch mehrere Cache-Control-Header, da JBoss standardmäßig einen No-Cache-Header hinzufügt.JBoss7 Einstellung Cache-Control, Pragma zu No-Cache für alle Antworten von RESTEasy

Ich finde keine Einstellung, um es zu entfernen und das Hinzufügen von Interceptors funktioniert auch nicht, da ein No-Cache-Header später hinzugefügt wird.

Kann mir jemand sagen, wie man die Standard-Header von Pragma und Cache-Control in JBoss 7 deaktiviert?

Hinweis: Ich benutze RESTYASY mit Stateless EJBs.

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

Getting die Antwort-Header wie

{ 
    "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

Schreiben Sie einen Filter. Nimm die Antwort; und manipuliere die gewünschten Header. – Abhin

+0

@Light Sie könnten Detail, dass ein bisschen, ihm eine Antwort machen und eine Prämie Score =) –

+0

Ich habe das gleiche Problem mit Wildfly 10 (und es scheint auch, wie das in Wildfly 8) zu sein, wo es immer auch die folgenden vorhanden ist im Antwortkopf: "Cache-Control: no-cache, no-store, muss-revalidate". Das Hinzufügen der @Cache-Annotation fügt nur ein zweites Header-Feld hinzu. Das kann nicht korrekt sein! Haben Sie eine Lösung für dieses Problem gefunden? –

Antwort

1

Ein Filter Ressource in einem Web-App können Sie im Grunde abfangen Anfragen und Antwort und vor allem für einige Anwendungsfälle der der Arbeit durch Änderung Request/Response-Header entworfen . Weitere Details here

Da Sie mit RESTEasy arbeiten, können Sie ContainerResponseFilter verwenden; eine von JAX-RS bereitgestellte Filterschnittstelle. Sie können Ihren benutzerdefinierten Filter schreiben, indem Sie diese Schnittstelle implementieren. Die Filterklasse (fügen Sie eine auf Ihre Web-App-Quellcode) wird wie folgt aussehen: -

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

    } 

} 

Hier überprüfen Sie im Grunde für die prescense von Cache-Control-Header und falls vorhanden entfernen Sie die vorhandenen und fügen Sie einen Ihrer besitzen. Bitte nicht die @Provider Anmerkung vergessen, die von der JAX rs Laufzeit benötigt wird Ihre benutzerdefinierten Filter zu entdecken.

Beachten Sie, dass mit diesem Filter alle Anfragen an Ihre Webanwendung abgefangen werden. Wenn Sie möchten, dass eine bestimmte Ressource oder eine Ressourcenmethode abgefangen wird, können Sie die Verwendung von @NameBinding

erkunden Lassen Sie mich wissen, ob das funktioniert.

+0

Entschuldigung. Aber das Hinzufügen eines Filters löst das Problem auch nicht. Der einzige Header, der vom Filter gefunden wird, ist der Inhaltstyp, der angibt, dass JBOSS den Pragma + Cache-Control-Header hinzufügt, nachdem der Antwortfilter verarbeitet wurde. – Gary

+1

Sieht aus wie es eine Lösung bei https://access.redhat.com/solutions/28847 ist, aber ich habe es nicht bezahltes Abonnement anzuzeigen. – Gary

+0

Entschuldigung. War einige Tage von SO weg. Sie können zwei Dinge versuchen: - 1) Versuchen Sie, @BindingPriority (0) Annotation zu Ihrem Filter hinzuzufügen. 2) Navigieren Sie zu Ihrem server.xml gefunden in Abhin