2012-07-18 19 views
8

我正在開發兩種類型的REST服務。基於RESTeasy中的HTTP頭進行攔截

  • 登錄前沒有會話標記將被傳遞給HTTP標頭。
  • 登錄後會話令牌將在每個請求中傳遞。

我不想在每個REST方法中包含@HeaderParam。我想先攔截它,並基於此我想檢查會話的有效性。請讓我知道

  1. 我如何進行攔截基於標題中的RESTEasy
  2. 如何避免攔截幾個方法

感謝。

回答

7

我解決了使用PreProcessInterceptor

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Securable { 
    String header() default "session-token"; 
} 

@Provider 
@ServerInterceptor 
public class ValidationInterceptor implements PreProcessInterceptor, AcceptedByMethod { 

    @Context 
    private HttpServletRequest servletRequest; 

    @Override 
    public boolean accept(Class clazz, Method method) { 
    return method.isAnnotationPresent(Securable.class); 
    } 

    @Override 
    public ServerResponse preProcess(HttpRequest httpRequest, ResourceMethod resourceMethod) throws Failure, 
     WebApplicationException { 

    Securable securable = resourceMethod.getMethod().getAnnotation(Securable.class); 
    String headerValue = servletRequest.getHeader(securable.header()); 

    if (headerValue == null){ 
     return (ServerResponse)Response.status(Status.BAD_REQUEST).entity("Invalid Session").build(); 
    }else{ 
     // Validatation logic goes here 
    } 

    return null; 
    } 
} 

@Securable將其上有待進一步驗證REST服務中使用的標註這個問題。

@Securable 
@PUT 
public Response updateUser(User user) 
+0

如果您使用的是Jersey,則創建一個註釋'x',並在註釋中提及@NameBinding。創建ContainerRequestFilter並將註釋「x」添加到此過濾器。現在用'x'註釋來裝飾你的服務 – jaks 2015-04-28 05:12:24

3

有兩種方法

  1. 使用JAX-RS interceptors - 您可以訪問請求對象的攔截器,這樣你就可以讀頭

  2. 使用好老JavaServlet過濾器 - 這是不是一個問題您正在使用JAX-RS,您也可以過濾REST請求。同樣地攔截器,過濾器可以訪問請求對象,這標題信息

在這兩種情況下,可以檢查是否存在的HttpSession(request.getSession()法),它已經必要的屬性。

您可以包含/排除通過配置或編程方式在Java代碼中過濾的請求,查看請求路徑。