@Context HttpServletRequest-Bereich in Jersey ContainerResponseFilter

8

Ich schreibe einen Jersey Response Filter. Ich benutze Jersey 1.17. Ich möchte Zugriff auf einige Attribute der httpServletRequest in der Filter-API erhalten. Der Weg, den ich gerade mache, ist wie folgt. Ist es sicher, das ServletRequest wie im unten stehenden Snippet zu injizieren, oder wird dies zu Problemen mit Nebenläufigkeit führen? Wenn mehrere Anfragen gleichzeitig eingehen, überschreibt sich der ServletRequest in verschiedenen Anfragen gegenseitig? Danke für deine Hilfe.

%Vor%     
lorcel 20.08.2013, 02:59
quelle

2 Antworten

6

Abschnitt 9.1 (zuletzt, 5.1 zuvor) Parallelität der JAX- RS-Spezifikation lautet:

  

Der Kontext ist spezifisch für eine bestimmte Anfrage, aber für bestimmte Fälle   JAX-RS-Komponenten (Provider und Ressourcenklassen mit einem Lebenszyklus   anders als per-Anfrage) müssen möglicherweise mehrere gleichzeitig unterstützen   Anfragen. Beim Injizieren einer Instanz eines der aufgelisteten Typen   Abschnitt 9.2, die mitgelieferte Instanz MUSS in der Lage sein, die   korrekter Kontext für eine bestimmte Anfrage. Die Verwendung eines lokalen Thread-Proxys ist eine übliche Methode   erreiche das.

Gemäß der Spezifikation sind JAX-RS-Implementierungen (z. B. Jersey) erforderlich, um sicherzustellen, dass der Kontext sicher ist. Mach weiter, was du tust.

Siehe auch: Extrahieren von Anforderungsattributen aus der Containeranforderung von Jersey

    
DannyMo 20.08.2013, 14:34
quelle
6

Sie sind in Sicherheit. Wenn Sie HttpServletRequest / HttpServletResponse injizieren, handelt es sich nicht um eine bestimmte Instanz, sondern um einen Proxy, mit dem Sie Aufrufe einer realen Instanz aufrufen, die in einer ThreadLocal Objekt. Jede Anfrage wird von einem separaten Thread bearbeitet, der Zugriff auf seine eigene HttpServletRequest / HttpServletResponse hat. Neben dem Injizieren von HttpServletRequest / HttpServletResponse können Sie auch ThreadLocal<HttpServletRequest> / ThreadLocal<HttpServletResponse> injizieren und durch '#get ()' können Sie die echten Request / Response-Instanzen von Proxies erhalten.

    
Michal Gajdos 20.08.2013 09:21
quelle