2011-01-07 3 views
10

Khi sử dụng @trước, bộ lọc chỉ được sử dụng trong một lớp. Làm cách nào để áp dụng bộ lọc chung trong playframework? Vì vậy, một bộ lọc được sử dụng cho tất cả các lớp điều khiển.Cách áp dụng bộ lọc chung trong playframework

+0

này liên quan đến câu hỏi của tôi http://stackoverflow.com/questions/4597766/easy-way-to-use-secure- mô-đun-hoặc-tương tự-trên-tất cả-bộ điều khiển-in-play. Tôi đã cố gắng sử dụng một enhancer bytecode để thêm một chú thích '@ With' cho tất cả các bộ điều khiển, nhưng điều đó dẫn tôi đến câu hỏi này: http://stackoverflow.com/questions/4608883/problem-with-classes-not-found-during -playplugin-enhanced –

+0

http://www.playframework.com/documentation/2.1.0/ScalaInterceptors – ThePizzle

Trả lời

6

Một giải pháp đơn giản là mở rộng bộ điều khiển cơ sở cho tất cả các bộ điều khiển của bạn và có @Before trong bộ điều khiển cơ sở.

Tùy chọn khác (và giải pháp tốt hơn, vì nó linh hoạt hơn) là sử dụng chú thích @With. Các ví dụ về các tài liệu hướng dẫn chơi là

Ví dụ:

public class Secure extends Controller { 

    @Before 
    static void checkAuthenticated() { 
     if(!session.containsKey("user")) { 
      unAuthorized(); 
     } 
    } 
}  

Và trên điều khiển khác:

@With(Secure.class) 
public class Admin extends Application { 

    ... 

} 

Điều này có nghĩa bộ điều khiển quản trị sẽ xử lý tất cả các máy bay đánh chặn (@Before, @After, @ Cuối cùng) chứa trong bộ điều khiển an toàn.

+2

Thật không may điều này vẫn yêu cầu bạn thêm chú thích '@ With' vào tất cả các bộ điều khiển. Đặc biệt trong trường hợp của các plugin an toàn, nó sẽ là thích hợp hơn để có thể làm cho tất cả các bộ điều khiển an toàn theo mặc định và sau đó danh sách trắng những người cần được công khai có thể truy cập. Tôi đã không tìm ra cách để làm điều đó được nêu ra. –

+0

đồng ý, tôi không thích giải pháp ở đây vì mọi nhà phát triển đều phải nhớ và hành vi của con người nói rằng nó sẽ bị lãng quên tại một thời điểm nào đó. –

1

Bạn chỉ cần sử dụng PlayPlugin cho vấn đề này. Xem here để biết thêm chi tiết.

+0

cẩn thận để xây dựng một chút? –

+0

Xin lỗi tôi đã vội vàng lần cuối. Bạn có thể tìm thấy một số thông tin tại đây: http://stackoverflow.com/questions/4515627/how-to-get-beforeactioninvocation-and-afteractioninvocation-to-be-called-in-play. Hy vọng rằng tôi sẽ tìm thấy thời gian để tạo ra một lời giải thích toàn diện hơn. – niels

2

tôi đã làm điều này rất bằng cách xử lý yêu cầu đến trên toàn cầu trong lớp GlobalSettings:

này mô tả các lớp: http://www.playframework.org/documentation/2.0/JavaGlobal

này mô tả các phương pháp bạn muốn ghi đè. http://www.playframework.org/documentation/2.0/JavaInterceptors

Dưới đây là một ví dụ về cách tôi đã sử dụng nó trong dự án của riêng tôi (tất nhiên, đây là một phiên bản đơn giản của những gì bạn đang tìm kiếm):

@Override 
public play.mvc.Action onRequest(play.mvc.Http.Request request, java.lang.reflect.Method method) { 
    if (request.path().startsWith("/secret/locked")) { 
     return new Action.Simple() { 
      @Override 
      public Result call(play.mvc.Http.Context ctx) throws Throwable { 
       return redirect(routes.Application.forbidden()); 
      } 
     }; 
    } 

    return super.onRequest(request, method); 
} 
+0

Bạn có mẫu mã cho Play 2.1/scala không? – ripper234

+1

@ ripper234 http: //www.playframework.com/documentation/2.1.0/ScalaInterceptors – ThePizzle

0

Nó không phải là một giải pháp tốt để mở rộng một bộ điều khiển cơ sở cho tất cả các bộ điều khiển của bạn và có @Before trong bộ điều khiển cơ sở.

Bạn có thể mở rộng bộ lọc hoặc bộ lọc tinh chỉnh .e.g.

lớp bộ lọc1 kéo dài Lọc {}

và áp dụng bộ lọc1 Global