2014-10-10 31 views
3

有沒有辦法攔截所有使用Play Framework 2.1的HTTP響應?攔截播放中的所有響應2.1

這是我在我的Global.java文件攔截所有請求,但我也期待攔截對策:

import java.lang.reflect.Method; 

import play.GlobalSettings; 
import play.mvc.*; 
import play.mvc.Http.*; 
import views.html.*; 

public class Global extends GlobalSettings { 

    private static BasicAuthHandler AUTH; 

    @SuppressWarnings("rawtypes") 
    @Override 
    public Action onRequest(Request request, Method actionMethod) { 

     if (...) { 
      return new Action.Simple() { 

       @Override 
       public Result call(Context ctx) throws Throwable { 
        return unauthorized(); 
       } 
      }; 
     } 

     return super.onRequest(request, actionMethod); 
    } 
} 

我讀過的文件上manipulating the response但它只是描述瞭如何爲每個結果單獨做。

回答

3

TransactionalAction是請求/響應攔截器的一個例子。它擴展了Action並提供了針對控制器類型或方法的Transactional註釋。與動作註釋的控制器方法的

實施例:

@Transactional 
public static Result ok(){ 
    return ok(); 
} 

More details

的動作測井響應的一個例子(記住,這不提供註釋等Transactional動作,延伸Action.Simple):

public class LogAction extends Action.Simple { 

    @Override 
    public F.Promise<Result> call(Http.Context ctx) throws Throwable { 
     F.Promise<Result> call = delegate.call(ctx); 
     return call.map(r -> { 
      String responseBody = new String(JavaResultExtractor.getBody(r, 0L)); 
      Logger.info(responseBody); 
      return r; 
     }); 
    } 
} 

用途,方法定義:

@With(LogAction.class) 
public static Result ok(){ 
    return ok(); 
} 

用法,類定義 - 截取的所有方法:

@With(LogAction.class) 
public class BaseController extends Controller { 

    .... 

} 

You ca如果你不喜歡@With註解,那麼向前走一步。定義自定義註釋自己:

@With({ LogAction.class }) 
@Target({ ElementType.TYPE, ElementType.METHOD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Log { 
} 

,並使用它是這樣的:如果你的自定義註解接受參數

@Log 
public static Result ok(){ 
    return ok(); 
} 

,改變LogAction的定義是這樣的:

public class LogAction extends Action<Log> { 
    // use configuration object to access your custom annotation configuration 
} 
+0

這是否意味着我有在所有返回結果的控制器方法之上添加「@With()'註釋? – 2014-10-10 18:55:02

+0

您可以將它放在類或方法定義級別。 – 2014-10-12 14:29:48