【问题标题】:Play 2.1.x default catch all route玩2.1.x 默认catch all route
【发布时间】:2013-12-28 20:57:32
【问题描述】:

Play 框架中是否有默认的 catch all fallback 路由?如果是这样,我如何在我的路由文件中配置它?目前,有些网址我不希望用户调用它们,即使他们调用,我也不希望出现该错误页面,而是希望它们转到我的 Web 应用程序的登录页面!有没有办法在路由配置文件中做到这一点?

【问题讨论】:

    标签: scala playframework routes playframework-2.1


    【解决方案1】:

    只需在routes 文件的末尾定义一个匹配任何路径的路由。不要忘记为您的资产定义特定的路线,例如:

    GET   /               controllers.Application.index
    GET   /some/path      controllers.Application.someHandler
    ...
    
    # End of file
    GET   /favicon.ico    controllers.Assets.at(path="/public", file="img/favicon.ico") 
    GET   /$file<(css|img|js|partials)/.*>    controllers.Assets.at(path="/public", file) 
    GET   /$path<.*>      controllers.Application.catchall(path)
    

    任何不被先前规则匹配的 URL 都将被这个规则匹配。

    【讨论】:

    • $符号代表什么,<.>代表什么?
    • 参见“带有自定义正则表达式的动态部件”中的documentation$id&lt;regex&gt; 定义了一个名称为“id”且必须匹配regex 的动态部件。这里,$path&lt;.*&gt; 是一个动态路径,它的名字是“path”并且匹配任何字符串。
    【解决方案2】:

    当您想对路径执行某些操作(即在您的自定义操作中手动解决它)时,捕获所有路由是有意义的,否则在您的 Global object 中使用常见的 onHandlerNotFound 并将请求重定向到您想要的任何位置就足够了。

    【讨论】:

    • 全局设置似乎很有趣。在您提到的链接中,它说 GlobalSettings.scala 应该位于默认包中,但我也可以从 application.conf 目录中引用它。那样的话,我可以把它放在我自己方便的包裹里吗?
    • 我确实试过了,但一直出错。这是我所做的: 23 override def onHandlerNotFound(request: RequestHeader): Result = { 24 NotFound( 25 views.html.defaultpages.notFound(request, None) 26 ) 27 } 上面调用的结果说它不兼容类型
    • 但是当我按照文档中提到的内容进行操作时:NotFound(views.html.notFoundPage(request.path)),我收到一个编译错误,提示找不到 notFoundPage。我应该写那个 notFoundPage 吗?
    • 当然,创建自己的视图,用通用的方式渲染模板
    • 我收到了来自编译器的警告,要求我使用依赖注入而不是全局对象。
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 2011-01-23
    • 2023-03-19
    • 2011-12-28
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多