2012-07-18 48 views
8

Tôi đang phát triển các dịch vụ REST với hai loại.Chặn dựa trên tiêu đề HTTP trong RESTeasy

  • trước khi đăng nhập, mã thông báo phiên sẽ không được chuyển đến tiêu đề HTTP.
  • sau mã thông báo phiên đăng nhập sẽ được chuyển trong mỗi yêu cầu.

Tôi không muốn bao gồm @HeaderParam trong mỗi và mọi phương thức REST. Tôi muốn đánh chặn nó đầu tiên và dựa trên đó tôi muốn kiểm tra tính hợp lệ của phiên. Xin vui lòng cho tôi biết

  1. làm thế nào tôi có thể đánh chặn dựa trên tiêu đề trong RESTEasy
  2. Làm thế nào để tránh chặn vài phương pháp

Cảm ơn.

Trả lời

7

tôi giải quyết vấn đề này bằng 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; 
    } 
} 

Chú thích @Securable sẽ được sử dụng trên dịch vụ REST mà cần phải được xác nhận.

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

Nếu bạn đang sử dụng Jersey thì hãy tạo chú thích 'x' và chú thích đề cập đến @NameBinding. Tạo ContainerRequestFilter và thêm chú thích 'x' vào bộ lọc này. Bây giờ trang trí các dịch vụ của bạn với chú thích 'x' – jaks

3

Có hai phương pháp

  1. Sử dụng JAX-RS interceptors - bạn có thể truy cập để yêu cầu đối tượng trong đánh chặn, vì vậy bạn có thể đọc tiêu đề

  2. Sử dụng tốt cũ Filters JavaServlet - nó không phải là một vấn đề mà bạn đang sử dụng JAX-RS, bạn cũng có thể lọc các yêu cầu REST. Tương tự như máy bay đánh chặn, các bộ lọc có quyền truy cập để yêu cầu đối tượng, trong đó có thông tin tiêu đề

Trong cả hai trường hợp, bạn có thể kiểm tra nếu HttpSession tồn tại (request.getSession() phương pháp) và nó đã được yêu cầu thuộc tính.

Bạn có thể bao gồm/loại trừ các yêu cầu được lọc theo cấu hình hoặc lập trình trong mã Java, xem đường dẫn yêu cầu.