it-swarm.com.de

Wie kann ich Anforderungsattribute aus Jerseys ContainerRequest extrahieren?

HttpServletRequest hat eine Methode setAttribute(String, Object).

Wie kann ich dieses Attribut aus ContainterRequest extrahieren?

Ich habe folgende Methode nicht gefunden: getAttribute!

Code

public class AuthenticationFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpReq = (HttpServletRequest) servletRequest;
        // .... ....
        httpReq.setAttribute("businessId", businessId);
    }
}

In Jersey Filter:

private class Filter implements ResourceFilter, ContainerRequestFilter {
    public ContainerRequest filter(ContainerRequest request) {
        // ..extract the attribute from the httpReq
    }
}
18
Dejell

Du kannst nicht Sie werden in keiner Weise durch die Jersey-API ausgesetzt. Wenn Sie die Jersey-Codebasis durchsuchen, werden Sie feststellen, dass es keine Verwendung von HttpServletRequest.getAttributeNames() gibt, die Sie erwarten würden, wenn sie in Massen kopiert würden. Sie finden auch, dass es nur eine Handvoll von HttpServletRequest.getAttribute() gibt, und dies ist ausschließlich für die interne Buchhaltung gedacht.

Beachten Sie jedoch, dass JAX-RS bei der Bereitstellung in einem Servlet-Kontext das ursprüngliche HttpServletRequest mit der Annotation @Context einfügen kann. Ich bin nicht sicher, ob Sie dies in einem Jersey-Filter tun können, aber es funktioniert in MessageBodyReaders/Writers und in Ressourcenklassen.

Update: Ich habe überprüft, und Sie können den HttpServletRequest tatsächlich in einen Jersey ContainerRequestFilter injizieren, indem Sie einfach Folgendes hinzufügen:

@Context private HttpServletRequest httpRequest;
37
Ryan Stewart

Ich habe den @Context funktioniert, habe aber das Problem, dass meine ContainerRequestFilter Singleton ist.

Ich musste einen benutzerdefinierten javax.servlet.Filter implementieren und eine ThreadLocal verwenden, um die HttpServletRequest zu speichern. 

3
huljas

Ich wollte zu meinen vorherigen Antworten meine Lösung hinzufügen und zusätzlich den Kontext hinzufügen:

@Context
private HttpServletRequest httpRequest;

Sie sollten set und get Attribute aus der session .

Einstellen:

 httpRequest.getSession().setAttribute("businessId", "yourId");

Erhalten:

Object attribute = httpRequest.getSession().getAttribute("businessId");
1
user7294900

Wenn Sie Jersey 2 verwenden, das JAX-RS 2.0 implementiert, können Sie eine ContainerRequestFilter implementieren, die eine Filtermethode wie folgt definiert:

public void filter(ContainerRequestContext requestContext) throws IOException;

ContainerRequestContext verfügt über getProperty(String)- und setProperty(String, Object)-Methoden, die in einer Servlet-Umgebung (ServletPropertiesDelegate) den getAttribute(String)- und setAttribute(String, Object)-Methoden der Servlet-Anforderung zugeordnet werden.

Siehe: Jersey auf GitHub

0
Steven Benitez