有没有办法在使用Play Framework 2.1时拦截所有HTTP响应?
这是我在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上的文档,但它仅描述了如何针对每个结果单独执行此操作。
答案 0 :(得分:3)
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 {
....
}
如果你不喜欢@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
}