我有一个自定义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
干杯。
发布于 2013-04-02 16:38:18
找到一种解决方案--如果筛选失败,请通过所需的操作进行重定向:
redirect(controller:"error", action:"fail4x")
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "blah")它强制错误控制器的触发器,而不需要URLMappings来捕获它。这似乎有点丑陋,所以请随时继续评论!
发布于 2014-04-03 13:39:51
有着相似的解决方案。我们在控制器中捕捉到并发问题,并抛出一个由后续过滤器捕获的异常。这在Grails 1.3.7中起作用。
升级到Grails2.1.0之后,抛出的异常反而生成一个500个错误,由URLMapping捕获。最后,我们在错误控制器中添加了一个操作,该操作与过滤器的工作相同,并且当URLMappings看到带有该异常的500时,只需重定向到它。
希望有一个更干净的方法来处理它,但肮脏的工作解决方案胜过一个干净的破碎的解决方案。
https://stackoverflow.com/questions/15766790
复制相似问题