如何按需运行过滤器scala play框架

Posted

技术标签:

【中文标题】如何按需运行过滤器scala play框架【英文标题】:How to run filter on demand scala play framework 【发布时间】:2017-11-13 10:02:25 【问题描述】:

我正在开发一个带有 play 框架的 scala 应用程序,我创建了一个过滤器来过滤来自外部服务器的每个请求,但现在我被困在两天后如何按需运行过滤器,我有80 个 API 其中 30 个需要运行特定的过滤器,我如何在这样的请求中读取请求路由模板

 GET /api/v1/:locale/:uuid core.controllers.MyClass.myAction1(locale: String)
 GET /api/v1/:locale/:uuid/MyRoute core.controllers.MyClass.myAction2(locale: String)
 GET /api/v1/:locale/:uuid/Foo core.controllers.MyClass.myAction3(locale: String)
 GET /api/v1/:locale/orders/:orderId core.controllers.MyClass.myAction4(locale: String)

好吧,这些路线被放置在路线文件中, 在过滤器中,如果路线具有 :uuid 变量或 :orderId 变量,我需要检查天气以运行其特定的过滤器,因为它们的两个 id,我将它们作为 uuid所以我无法期待请求,我可以阅读路线模板吗?

【问题讨论】:

【参考方案1】:

您可以从RequestHeader#attrs获取一些路由信息:

// in your filter
val handlerDef: Option[HandlerDef] = request.attrs.get(Router.Attrs.HandlerDef)

见HandlerDef api

【讨论】:

我认为这是最好的解决方案,我可以制作许多过滤器并注意 url 模板 那么,为什么在 url 变量中显示这样的正则表达式 /api/v1/$locale/ 你能告诉我这里发生了什么 路由文件在生成路由器实现之前被解释和解释。可以在路由文件中使用正则表达式:playframework.com/documentation/2.6.x/… 使用/api/v1/:locale/时会被重写为使用正则表达式,这样框架就可以直接使用了 .get 将其从选项中删除是否不安全? Router.Attrs.HandlerDef 什么时候不存在?【参考方案2】:

如果您想从 80 个动作中选择 30 个来运行一些通用逻辑,您还可以考虑使用“动作构建器”来提供该逻辑。

当你使用Action ... 时,你会得到一个普通的动作。您还可以创建自己的 MyAction ... 包装一个普通的 Action 并运行自定义逻辑。这是ActionBuilder。如果您使用这种方法,您只需更新您的 30 个操作以使用该自定义操作生成器。

见:https://www.playframework.com/documentation/2.6.x/ScalaActionsComposition#Custom-action-builders

【讨论】:

我认为动作生成器会有点困难 没问题,HandlerDef 也可以。实际上,我在 Play Framework 中编写了将 HandlerDef 存储在请求属性中的代码。 :) 操作构建器的好处是,事情的类型安全性和明确性更高——但有时过滤器是更好的选择。

以上是关于如何按需运行过滤器scala play框架的主要内容,如果未能解决你的问题,请参考以下文章

我将如何在播放框架 2.4.3 (Scala) 中实现拦截器/过滤器

play for scala 实现SessionFilter 过滤未登录用户跳转到登录页面

路由前如何在 Play 1.2.x 中调用 servlet 过滤器

如何搭建scala的play框架

如何将 IntelliJ 与 Play Framework 和 Scala 一起使用

如何在视图页面中使用Play框架和Scala显示图像