如何在 playframework 中应用全局过滤器
Posted
技术标签:
【中文标题】如何在 playframework 中应用全局过滤器【英文标题】:How to apply a global filter in playframework 【发布时间】:2011-01-07 08:53:11 【问题描述】:使用@before 时,只在一个类中使用。?这样一个过滤器就可用于所有控制器类。
【问题讨论】:
这与我的问题***.com/questions/4597766/… 有关。我尝试使用字节码增强器向所有控制器添加@With
注释,但这导致我提出这个问题:***.com/questions/4608883/…
playframework.com/documentation/2.1.0/ScalaInterceptors
【参考方案1】:
一个简单的解决方案是为所有控制器扩展一个基本控制器,并在基本控制器中添加@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)。
【讨论】:
不幸的是,这仍然需要您将@With
注释添加到所有控制器。特别是在安全插件的情况下,最好能够让所有控制器默认安全,然后将那些应该可以公开访问的控制器列入白名单。不过我还没想好怎么做。
同意,我不喜欢这里的解决方案,因为每个开发人员都必须记住并且人类行为表明它会在某个时候被遗忘。【参考方案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);
【讨论】:
【参考方案3】:您可以简单地使用 PlayPlugin 来解决这个问题。详情请见here。
【讨论】:
对不起,我上次赶时间。你可以在这里找到一些信息:***.com/questions/4515627/…。希望我能抽出时间来创建一个更全面的解释。【参考方案4】:为所有控制器扩展基本控制器并在基本控制器中包含 @Before 并不是一个好的解决方案。
您可以扩展过滤器或 essensialfilter .e.g.
类过滤器1扩展过滤器
并将 filter1 应用于全局
【讨论】:
以上是关于如何在 playframework 中应用全局过滤器的主要内容,如果未能解决你的问题,请参考以下文章