繁体   English   中英

如何在playframework中应用全局过滤器

[英]How to apply a global filter in playframework

使用@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 {

    ...

}

这意味着Admin控制器将处理Secure控制器中包含的所有拦截器(@ Before,@ After,@Finally)。

我通过在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);
}

您可以简单地使用PlayPlugin来解决此问题。 有关详细信息,请参见此处

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

您可以扩展过滤器或essensialfilter .eg

class filter1 extends Filter {}

并将filter1应用于Global

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM