2016-10-17 6 views
1

Ich habe eine Spring Boot-Anwendung mit Resteasy-Feder-3.0.19 und jboss-Jaxrs-api_2.0_spec-1.0.0.Spring RestEasy Interceptor

Ich möchte alle restlichen Anrufe für die Autorisierung abfangen.

Der Interceptor wird nicht aufgerufen. Wie kann ich den @Path Annotation-Wert der Zielmethode im Interceptor erhalten?

Muss ich dies in der Spring Boot App registrieren?

@Provider 
public class AuthorizationtInterceptor implements ContainerRequestFilter{ 

    /** 
    * 
    */ 
    public AuthorizationtInterceptor() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 

     String method = requestContext.getMethod(); 

     UriInfo uriInfo = requestContext.getUriInfo(); 

     // Need the target method @Path annotation value .... 

    } 

} 

Zielruhe Klasse,

@Named 
@Singleton 
@Path(ROOT_PATH) 
public class WebController { 

    @GET 
    @Path(TEST_PATH) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getUser(@Context final HttpServletRequest request) { 
    } 
} 

Antwort

1

In einem post-Anpassungsfilter (ein Filter ohne @PreMatching Anmerkung), können Sie ResourceInfo verwenden, um die angepassten Ressourcenklasse und die Ressource-Methode zu erhalten.

Inject ResourceInfo in Ihrem Filter mit der @Context Anmerkung:

@Context 
private ResourceInfo resourceInfo; 

dann die Ressourcenklasse erhalten und extrahieren Sie die @Path Anmerkung:

Path path = resourceInfo.getResourceClass().getAnnotation(Path.class); 

Um die Ressource Methode, Verwendung zu erhalten:

Path path = resourceInfo.getResourceMethod().getAnnotation(Path.class); 

Abhängig von Was Sie erreichen möchten, statt den Wert der @Path Annotation für Autorisierungszwecke zu vergleichen, können Sie Ihren Filter an eine Reihe von Ressourcenklassen oder Methoden binden. Sehen Sie mehr Details in diesem answer.


Je nachdem, wie Sie Ihre Anwendung einrichten, müssen Sie die Filter in Ihrer Application Unterklasse oder in Ihrem web.xml Deployment Descriptor registrieren.

+0

Es wird nach der Registrierung des Filters aufgerufen, als ob wir andere Filter in der Klasse mit @Configuration Annotation registrieren würden. Pfadpfad = resourceInfo.getResourceClass(). GetAnnotation (Path.class); gibt Klassenannotation zurück, nicht die Methode, die übereinstimmt. Ich brauche auch die HttpServletRequest, also verwende ich Kontext private HttpServletRequest Anfrage ;. Ist das ok? – user1578872

+0

@ user1578872 Ja, Sie können den 'HttpServletRequest' mit' @Context HttpServletRequest request' injizieren. Eine vollständige Liste der Typen, die mit '@ Context' injiziert werden können, finden Sie in dieser [Antwort] (http://stackoverflow.com/a/35868654/1426227). –

Verwandte Themen