2016-10-17 181 views
1

我有一個Spring引導應用程序resteasy-spring-3.0.19和jboss-jaxrs-api_2.0_spec-1.0.0。Spring RestEasy攔截器

我想攔截所有其他的授權調用。

攔截器沒有被調用。另外,如何獲得攔截器中的目標方法@Path註釋值。

我是否需要在Spring啓動應用程序中註冊這個?

@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 .... 

    } 

} 

目標休息級,

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

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

回答

1

在匹配後過濾器(不@PreMatching註釋濾波器),你可以使用ResourceInfo獲得匹配的資源類和資源的方法。

@Context 
private ResourceInfo resourceInfo; 

然後得到的資源類,並提取@Path註釋:

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

要獲得資源的方法,使用:

進樣中使用@Context註釋你的過濾器ResourceInfo

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

取決於您試圖實現的目標,而不是比較用於授權目的的@Path註釋的值,您可以考慮將過濾器綁定到一組資源類或方法。在answer中查看更多詳情。


取決於你如何設置你的應用程序,你可能需要在您Application子類,或者在您的web.xml部署描述符中註冊的過濾器。

+0

它在註冊過濾器之後被調用,就好像我們在具有@Configuration註解的類中註冊其他過濾器一樣。 Path path = resourceInfo.getResourceClass()。getAnnotation(Path.class);返回類註解,而不是匹配的方法。我還需要HttpServletRequest,所以我使用上下文 私有的HttpServletRequest請求;這個可以嗎? – user1578872

+0

@ user1578872是的,您可以使用'@Context HttpServletRequest請求'注入'HttpServletRequest'。有關可以使用'@ Context'注入的類型的完整列表,請參閱此[答案](http://stackoverflow.com/a/35868654/1426227)。 –