【问题标题】:Trigger filter before URLMappings in Grails在 Grails 中的 URLMappings 之前触发过滤器
【发布时间】:2015-05-07 16:37:22
【问题描述】:

我想在通过 urlmapping 之前触发过滤器,我该怎么做? 这是一个场景,用户在 www.myapp.com/someurl 中键入,而“someurl”未映射到 UrlMappings.groovy,因此用户将被重定向到 404 页面。但我想在进入 404 页面之前拦截该进程。 'someurl' 可能是任何东西,可能是 '/users'、'users/admin/43' 或任何东西。

我发现的一个选项是使用 servlet 级别过滤器,但这似乎给我带来的麻烦比我预期的要多;添加此过滤器不会让页面呈现,我只是得到一个空白的白色屏幕。还有其他方法吗?

基本上,我试图在 urlmappings 中验证之前重写 url。

【问题讨论】:

  • 使用 Grails 过滤器并重定向到 URL 映射中列出的新 URL 有什么问题?从您的问题中很难理解您要做什么以及遇到了什么问题。
  • 我在问题中添加了更多描述。
  • 所以基本上你试图在它到达 URLMapping 并确定它是 404 之前拦截一些东西?
  • @EddardStark 使用过滤器将一个 url 映射到另一个 url 不是一个好主意,使用 url 映射这就是我们拥有它们的原因。
  • @JoshuaMoore 是的!没错!

标签: grails filter servlet-filters


【解决方案1】:

如果我理解正确,您想要的是让用户输入他们想要的任何 URI,然后您想自己检查 URI 并可能重定向到常规 url 映射之一?我在我的项目中做了类似的事情,首先我改变了默认的 url 映射:

"/url/$controller/$action?/$id?"{
    constraints {
        // apply constraints here
    }
}

然后又添加了一个

"/$level1/$level2?/$level3?/$level4?"(controller: 'anything', action: 'resolve') {
}

然后是一个类似的控制器:

class AnythingController {
    def resolve(String level1, String level2, String level3, String level4) {
        if (level1 == 'music') {
            return redirect (controller: 'music')
        } else {
            // any logic you need
        }
    }
}

这样你可以在控制器中处理“任何事情”,如果你想使用常规的 /controller/action uri,那么你只需在它前面加上“/url”

【讨论】:

  • 是的,有点像,但不完全是。我们正在对整个应用程序进行大规模的 url 更改。因此,像 /user 这样的 URL 将是 /user-area 或 /admin 将是 /admin-area 等等。 url 更改非常简单,但我担心应用程序内以及应用程序之外对这些页面的所有引用。所以我正在考虑添加一个过滤器或任何东西来将 /user 重定向到 /user-area 等等。
猜你喜欢
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多