拦截播放中的所有响应2.1
问题描述:
有没有办法拦截所有使用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但它只是描述了如何为每个结果单独做。
答
TransactionalAction是请求/响应拦截器的一个例子。它扩展了Action并提供了针对控制器类型或方法的Transactional注释。与动作注释的控制器方法的
实施例:
@Transactional
public static Result ok(){
return ok();
}
的动作测井响应的一个例子(记住,这不提供注释等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
}
这是否意味着我有在所有返回结果的控制器方法之上添加“@With()'注释? – 2014-10-10 18:55:02
您可以将它放在类或方法定义级别。 – 2014-10-12 14:29:48