使用@before时,它仅在一个类中使用。如何在playframework中应用全局过滤器?因此,一个过滤器用于所有控制器类。
答案 0 :(得分:6)
一个简单的解决方案是为所有控制器扩展一个基本控制器,并在基本控制器中使用@Before。
另一个选项(更好的解决方案,因为它更灵活)是使用@With注释。播放文档中的示例是
示例:
public class Secure extends Controller {
@Before
static void checkAuthenticated() {
if(!session.containsKey("user")) {
unAuthorized();
}
}
}
另一位控制人员:
@With(Secure.class)
public class Admin extends Application {
...
}
这意味着Admin控制器将处理Secure控制器中包含的所有拦截器(@ Before,@ After,@Finally)。
答案 1 :(得分:2)
我通过在GlobalSettings类中全局处理传入请求来做到这一点:
这描述了这个类: http://www.playframework.org/documentation/2.0/JavaGlobal
这描述了您想要覆盖的方法。 http://www.playframework.org/documentation/2.0/JavaInterceptors
以下是我在自己的项目中使用它的示例(当然,这是您正在寻找的简化版本):
@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);
}
答案 2 :(得分:1)
您可以简单地使用PlayPlugin来解决此问题。有关详细信息,请参阅here。
答案 3 :(得分:0)
为所有控制器扩展基本控制器并在基本控制器中使用@Before不是一个好的解决方案。
您可以扩展过滤器或essensialfilter .e.g。
class filter1扩展了Filter {}
并将filter1应用于Global