如何按需运行过滤器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 过滤器