1

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

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

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

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

有没有办法解决这个问题,以便我的 401 来自失败的过滤器被 URLMappings 捕获(假设我已经正确解释了正在发生的事情,并清楚地解释了它!)

[使用 Grails 2.1.1]

干杯。

4

2 回答 2

0

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

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

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

于 2013-04-02T16:38:18.397 回答
0

使用类似的解决方案有类似的问题。我们在控制器中捕获并发问题并抛出被过滤器捕获的异常。这在 Grails 1.3.7 中工作

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

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

于 2014-04-03T13:39:51.640 回答