如何将 grails 配置为始终在状态 500 上显示自己的错误页面

Posted

技术标签:

【中文标题】如何将 grails 配置为始终在状态 500 上显示自己的错误页面【英文标题】:How to configure grails to always show own error page on status 500 【发布时间】:2011-05-22 19:12:31 【问题描述】:

UrlMappings.groovy 中,我设置了"500"(controller:'error', action:'error'),以便使用我自己的错误控制器(和视图)。

它通常可以工作,但是当我尝试篡改请求输入(提交大小为 1MB 的参数)时,我得到一个 Tomcat 生成的错误页面,HTTP 状态为 500。

首先我以为这个错误只是由 Tomcat 产生的,所以 grails 对此无能为力,但异常是 org.springframework.web.util.NestedServletException(嵌套异常 java.lang.***Error),并且有很多 org.codehaus.groovy.grails 打包类堆栈跟踪。

我认为向潜在攻击者显示包含堆栈跟踪的此异常是危险的,那么我如何配置 grails 以始终显示我自己的错误页面?还是只能在Tomcat中配置?

【问题讨论】:

【参考方案1】:

这可能是一个 Grails 错误。我找到了this Nabble thread,它把我带到了this JIRA issue。该问题已解决,但在链接到 different JIRA issue 的 cmets 中,Peter Led*** 可能是您的问题,也可能不是。

如果您确实遇到了这种情况,那么 cmets 中建议了一种解决方法,可以在 here 找到。该错误本身计划在 1.4 中修复;上面的修复解决方法针对 1.3

【讨论】:

我想尝试修复,但是当我运行“grails install-plugin myFolder/grails-error-pages-fix.zip”时,grails 似乎在网上寻找它而不是使用本地版本.而且它不能通过标准存储库获得......它只在 github 上:github.com/alkemist/grails-error-pages-fix 知道如何安装它吗? 您可能可以下载源代码(右上角的“下载”按钮),解压缩,构建它,然后使用构建的分发包安装插件。我不能说我曾经从 Github 安装过 Grails 插件,所以恐怕我不是最好的指导你的人。但也许其他人可以插话。 我现在使用“install-plugin download.github.com/alkemist-grails-error-pages-fix-303f215.zip”得到它。但是安装程序失败说“没有找到 plugin.xml 描述符!” (它真的不存在)。我猜它不是一个真正的插件,但必须手动集成到项目中...... 感谢作者的回复,我只需使用“grails install-plugin error-pages-fix”就可以正常工作!但是我检查了一下,不幸的是它并没有解决问题。【参考方案2】:

同意 Rob Hruska 的观点,我自己偶然发现了他的大部分链接。

我也怀疑 grails-error-pages-fix 插件应该解决这个问题 - 因为默认情况下 grailsWebRequest servlet 没有在 web.xml.

这个插件使用的技术与我在previous post 中建议的技术基本相同。 (尽管如此,我自己的测试,正如我在那里的 cmets 所看到的那样,还没有得出一致的结果。)

最后,无论如何都行得通的一件事是实现custom servlet Filter

【讨论】:

+1 对于自定义过滤器,我在大多数应用程序中都这样做,因为它提供了更多控制(而不是让容器为您处理错误)。

以上是关于如何将 grails 配置为始终在状态 500 上显示自己的错误页面的主要内容,如果未能解决你的问题,请参考以下文章

Grails,SpringSecurity - 如果未记录,则禁用重定向

如何将不存在的页面显示为404错误页面

如何在 Grails 控制器之间传递错误消息?

如何设置永远记住我或登录grails?

在 Grails 中使用 HTTP 状态代码呈现 JSON 的简单方法

如何在 grails 中使用会话