2013-08-20 3 views
8

Sto scrivendo un filtro di risposta Jersey. Sto usando Jersey 1.17. Voglio avere accesso ad alcuni attributi di httpServletRequest nell'API filtro. Il modo in cui ciò che sto facendo in questo momento è il seguente. È sicuro iniettare il servletRequest come nello snippet qui sotto o causerà qualche tipo di problema di concorrenza? Se ci sono più richieste in arrivo, il servletRequest in richieste diverse si sovrascrive a vicenda? Grazie per il tuo saluto.@Context HttpServletRequest scope in Jersey ContainerResponseFilter

public class LoggingFilter implements ContainerResponseFilter { 
@Context private HttpServletRequest servletRequest; 
@Override 
public ContainerResponse filter(final ContainerRequest req, final ContainerResponse resp) { 
String s = this.servletRequest.getAttribute("xxx"); 
.... 
} 
} 

risposta

6

Sezione 9.1 (ultima, 5.1 in precedenza) concorrenza dei JAX-RS specification stati:

contesto è speci fi co ad una particolare richiesta, ma le istanze di alcuni componenti JAX-RS (fornitori e classi di risorse con un ciclo di vita altro che per richiesta) potrebbe essere necessario supportare più richieste simultanee . Quando si esegue l'iniezione di un'istanza di uno dei tipi elencati nella Sezione 9.2, , l'istanza fornita DEVE essere in grado di selezionare il contesto corretto per una particolare richiesta. L'utilizzo di un proxy locale thread è un modo comune per ottenere questo risultato da .

Quindi, come da specifica, sono necessarie implementazioni JAX-RS (ad esempio Jersey) per garantire che il contesto sia sicuro. Continua a fare quello che stai facendo.

Vedi anche: Extract request attributes from container request of Jersey

+1

Grazie mille. Non mi aspettavo che le persone avrebbero risposto alla mia domanda così in fretta. Questo mi ha davvero sorpreso e risolto il problema. – lorcel

6

Sei al sicuro. Quando si sta iniettando HttpServletRequest/HttpServletResponse non si ha a che fare con una particolare istanza, ma piuttosto con un proxy attraverso il quale si invocano chiamate su un'istanza reale memorizzata in un oggetto ThreadLocal. Ogni richiesta viene elaborata da un thread separato che ha accesso al proprio HttpServletRequest/HttpServletResponse. Oltre all'iniezione di HttpServletRequest/HttpServletResponse è anche possibile iniettare ThreadLocal<HttpServletRequest>/ThreadLocal<HttpServletResponse> e tramite il metodo '#get() `è possibile ottenere le istanze di richiesta/risposta reali in attesa di proxy.

+0

Grazie Michal. In realtà non mi aspettavo che le persone avrebbero risposto alla mia domanda così in fretta. Questo mi ha davvero sorpreso e risolto il problema. – lorcel