2015-04-29 21 views
9

Ho un ContainerResponseFilter e ho cercato di impostare un cookie nel modo seguente:Jersey: Posso aggiungere un cookie in ContainerResponseFilter?

@Override 
public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException { 
    String cookieName = "ExampleCookie"; 
    String cookieValue = "SomeData"; 
    logger.info("Setting cookie " + cookieName + " with value " + cookieValue + " into cookies " + JsonUtils.objectToJson(containerResponseContext.getCookies())); 
    containerResponseContext.getCookies().put(cookieName, new NewCookie(cookieName, cookieValue)); 
} 

Ma questo danno il seguente errore:

Caused by: java.lang.UnsupportedOperationException: null 
    at java.util.AbstractMap.put(AbstractMap.java:203) ~[na:1.7.0_67] 

Non è possibile impostare il cookie qui? Se lo è, come lo farei?

risposta

12

Sì, sembra un po 'strano che questo non è permesso. Non so perché questo non è permesso. Ho provato entrambi con Jersey e Resteasy. Con Resteasy, tutto ciò che accade è che il cookie non è impostato (nessuna eccezione). Sto pensando che alcune operazioni impostino i cookie come intestazioni e, una volta raggiunto il filtro, non viene eseguita alcuna operazione con i cookie.

L'unico lavoro intorno mi viene in mente è quello di impostare semplicemente l'intestazione da soli

responseContext.getHeaders().add("Set-Cookie", new NewCookie("Hello", "World")); 

La toString() di NewCookie torneranno come dovrebbe apparire nell'intestazione

Set-Cookie: Hello=World;Version=1 
+0

Grazie mille per aver uno sguardo. Penso che l'approccio delle intestazioni sia semplice. –

+0

Per quanto riguarda la stranezza, REST è progettato per essere apolidi. Un cookie implica uno stato. – BalusC

+0

@peeskillet se inviamo un nuovo cookie dal browser ... i server web li inviano di nuovo al browser per impostazione predefinita? Sto testando con il postino e l'ho osservato. – pinkpanther