2011-01-07 45 views
10

使用@before时,仅在一个类中使用。如何在游戏框架中应用全局过滤器?因此,所有控制器类都使用一个过滤器。如何在游戏框架中应用全局过滤器

+0

这关系到我的问题http://stackoverflow.com/questions/4597766/easy-way-to-use-secure-模块或类似于所有控制器的游戏。我试图使用字节码增强器为所有控制器添加一个“@ With”注释,但是这引起了我的这个问题:http://stackoverflow.com/questions/4608883/problem-with-classes-not-found-during -playplugin-enhance – 2011-01-08 19:27:35

+0

http://www.playframework.com/documentation/2.1.0/ScalaInterceptors – ThePizzle 2013-03-06 18:06:30

回答

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 { 

    ... 

} 

这意味着管理控制器将处理所有的拦截(@Before,@After,@最后)包含在安全控制器中。

+2

不幸的是,这仍然要求您将`@ With`注释添加到所有控制器。特别是在安全插件的情况下,最好能够使所有控制器默认安全,然后将那些应该可公开访问的白名单列入白名单。但我还没有想出如何做到这一点。 – 2011-01-08 19:31:37

+0

表示同意,我不喜欢这里的解决方案,因为每个开发人员都必须记住,并且人类行为表示它会在某个时候被遗忘。 – 2012-02-17 03:05:18

1

您可以简单地在这个问题上使用PlayPlugin。有关更多详细信息,请参见here

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); 
} 
0

这不是一个很好的解决方案来扩展一个用于所有控制器的基础控制器,并在基础控制器中拥有@Before。

您可以扩展过滤器或essensialfilter .e.g。

级过滤器1扩展器{}

和应用过滤器1至全球