Filter 如何在playframework中应用全局筛选器

Filter 如何在playframework中应用全局筛选器,filter,playframework,Filter,Playframework,使用@before时,它只在一个类中使用。如何在playframework中应用全局筛选器?因此,一个筛选器用于所有控制器类。一个简单的解决方案是为所有控制器扩展一个基本控制器,并在基本控制器中使用@Before 另一个选项(更好的解决方案,因为它更灵活)是使用@With注释。播放文档中的示例如下 例如: public class Secure extends Controller { @Before static void checkAuthenticated() {

使用@before时,它只在一个类中使用。如何在playframework中应用全局筛选器?因此,一个筛选器用于所有控制器类。

一个简单的解决方案是为所有控制器扩展一个基本控制器,并在基本控制器中使用@Before

另一个选项(更好的解决方案,因为它更灵活)是使用@With注释。播放文档中的示例如下

例如:

public class Secure extends Controller {

    @Before
    static void checkAuthenticated() {
        if(!session.containsKey("user")) {
            unAuthorized();
        }
    }
}    
在另一个控制器上:

@With(Secure.class)
public class Admin extends Application {

    ...

}

这意味着管理员控制器将处理安全控制器中包含的所有拦截器(@Before、@After、@Finally)

您只需使用PlayPlugin即可解决此问题。有关更多详细信息,请参阅。

我通过在GlobalSettings类中全局处理传入请求来实现这一点:

这描述了该类:

这描述了要覆盖的方法。

下面是我在自己的项目中如何使用它的一个示例(当然,这是您正在寻找的内容的简化版本):


为所有控制器扩展基本控制器并在基本控制器中使用@Before不是一个好的解决方案

您可以扩展过滤器或essensialfilter

类filter1扩展了筛选器{}


并将过滤器1应用于全局

这与我的问题有关。我试图使用字节码增强器向所有控制器添加带有注释的
@注释,但这让我想到了这个问题:不幸的是,这仍然要求您向所有控制器添加带有
注释的
@。特别是在安全插件的情况下,最好能够使所有控制器在默认情况下都是安全的,然后将那些应该公开访问的控制器列入白名单。虽然我还没有弄明白怎么做。我同意,我不喜欢这里的解决方案,因为每个开发人员都必须记住,而且人类行为说它会在某个时候被忘记。对不起,上次我很匆忙。您可以在此处找到一些信息:。希望我能抽出时间做一个更全面的解释。
@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);
}