2014-05-13 48 views
16

Tôi đang cố gắng thực hiện một số xác nhận về các yêu cầu đi vào dịch vụ của mình bằng cách sử dụng ContainerRequestFilter. Mọi thứ đều hoạt động tốt, tuy nhiên có một vấn đề - mỗi yêu cầu được chuyển qua các bộ lọc, mặc dù một số bộ lọc sẽ không bao giờ áp dụng cho chúng (một bộ lọc chỉ xác thực trên ResourceOne, một bộ lọc khác chỉ trên ResourceTwo, v.v.)Bộ lọc yêu cầu Jersey chỉ trên một số URI

Có cách nào để đặt bộ lọc chỉ để được gọi trên yêu cầu trong các điều kiện nhất định không?

Trong khi nó không phải là một chặn hoặc cản trở, nó sẽ được tốt đẹp để có thể ngăn chặn loại hành vi :)

Trả lời

37

tôi giả sử rằng bạn đang sử dụng Jersey 2.x (thực hiện cho JAX-RS 2.0 API).

Bạn có hai cách để đạt được mục tiêu của mình.

1. Sử dụng Tên bindings:


1,1 Tạo chú thích tùy chỉnh chú thích với @NameBinding:

@NameBinding 
@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface AnnotationForResourceOne {} 

1,2. Tạo bộ lọc bằng chú thích của bạn:

@Provider 
@PreMatching 
@AnnotationForResourceOne 
public class ResourceOneFilter implements ContainerRequestFilter { 
... 
} 

1.3. Và ràng buộc bộ lọc tạo ra với phương pháp tài nguyên được lựa chọn:

@Path("/resources") 
public class Resources { 
    @GET 
    @Path("/resourceOne") 
    @AnnotationForResourceOne 
    public String getResourceOne() {...} 
} 

2. Sử dụng DynamicFeature:


2,1. Tạo bộ lọc:

public class ResourceOneFilter implements ContainerRequestFilter { 
... 
} 

2.2. Thực hiện giao diện javax.ws.rs.container.DynamicFeature:

@Provider 
public class MaxAgeFeature implements DynamicFeature { 
    public void configure(ResourceInfo ri, FeatureContext ctx) { 
     if(resourceShouldBeFiltered(ri)){ 
      ResourceOneFilter filter = new ResourceOneFilter(); 
      ctx.register(filter); 
     } 
    } 
} 

Trong kịch bản này:

  • lọc không chú thích với @Provider chú thích; Phương thức
  • configure(...) được gọi cho mọi phương thức tài nguyên;
  • ctx.register(filter) liên kết bộ lọc với phương pháp tài nguyên;
+0

DynamicFeature hoạt động như một nét duyên dáng. –

+5

Bạn có chắc chắn chú thích '@ PreMatching' là cần thiết trong ví dụ NameBinding không? – Zakhar

+0

Các ràng buộc tên không hoạt động đối với tôi – Kunal

7

Khi chúng tôi sử dụng @NameBinding, chúng tôi cần xóa chú thích @PreMatching khỏi Bộ lọc. @PreMatching khiến tất cả các yêu cầu đi qua bộ lọc.

1

@PreMatching không hoạt động cùng với @NameBinding, vì lớp/phương thức tài nguyên chưa được biết trong giai đoạn trước khớp. Tôi đã giải quyết vấn đề này bằng cách xóa @PreMatching khỏi bộ lọc và sử dụng mức độ ưu tiên ràng buộc. Xem ResourceConfig.register(Object component, int bindingPriority).

Bộ lọc được thực hiện trước khi tài nguyên chỉ nhận được mức độ ưu tiên cao hơn.

Các vấn đề liên quan