从过滤器返回false时Grails URLMapping?

时间:2013-04-02 14:29:47

标签: grails filter url-mapping

我有一个自定义URLMapping,可以捕获错误代码并调用一些代码(用于监控5xx / 4xx响应):

// Explicit error-handling for monitoring
"401"(controller:"error", action:"fail4x")
..
"501"(controller:"error", action:"fail5x")
...

我还有一个过滤器,在关闭之前在中执行一些身份验证工作,如果失败则将响应状态设置为401,并且还从过滤器返回false。

问题是URLMappings没有捕获401。根据文档,从过滤器返回false“[表示]已经处理了响应,所有未来的过滤器和操作都不应该执行” - 所以我猜测Grails几乎放弃了所有内容,包括处理URLMapping通常会捕获其他4xx错误吗?

有没有解决方法,以便URLMappings捕获失败过滤器中的401(假设我已经正确解释了发生了什么,并清楚地解释了它!)

[使用Grails 2.1.1]

干杯。

2 个答案:

答案 0 :(得分:0)

找到一种解决方案 - 如果过滤器失败,请执行所需操作的重定向:

redirect(controller:"error", action:"fail4x") 
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "blah")

强制错误控制器的触发器,绕过了URLMappings捕获它的需要。虽然看起来有点难看,所以请随时评论!

答案 1 :(得分:0)

与类似的解决方案有类似的问题。我们在控制器中捕获了并发问题,并抛出了 after 过滤器捕获的异常。这在Grails 1.3.7

中有效

升级到Grails 2.1.0之后,引发的异常只会生成500错误,该错误会被URLMapping捕获。我们最终在错误控制器中添加了一个与过滤器完成相同工作的操作,并且只是在URLMappings看到具有该异常的500时重定向到它。

希望有一种更清洁的方法来处理它,但是一种肮脏的工作解决方案击败了一个干净的破碎的