2014-10-10 5 views
3

Есть ли способ перехватить все ответы HTTP при использовании Play Framework 2.1?Перехватить все ответы в Play 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 { 

    .... 

} 

Вы, n идти на один шаг вперед, если вам не нравится @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()' прежде всего методов контроллера, которые возвращают результаты? –

+0

Вы можете указать его на уровне определения класса или метода. –