服务器抛出异常时如何避免用户获得500个错误

时间:2012-03-06 09:55:22

标签: security exception error-handling xpages

我的服务器日志中出现以下错误。

  • 2012-03-06 09:20:43 HTTP JVM:CLFAD0211E:抛出异常。有关更多详细信息,请参阅位于D:/ Lotus / Domino / data / domino / workspace / logs中的error-log-0.xml
  • 2012-03-06 09:20:43 HTTP JVM:CLFAD0229E:发生安全异常服务请求:/demo.nsf/home.xsp - HTTP代码:500。有关更多详细信息,请参阅error-log- 0.xml位于D:/ Lotus / Domino / data / domino / workspace / logs

用户只能在webbrowser(来源)中看到这个

<html>
<head>
<title>Error</title></head>
<body text="#000000">
<h1>Error 500</h1>HTTP Web Server: Command Not Handled Exception</body>
</html>

所以我可以通过服务器日志告诉服务器上有一个安全异常,可能是因为我的java.policy文件中的设置有错误。但我的问题不是导致错误的原因,而是如何避免用户收到这些丑陋的500错误。

我希望我在应用程序中设置的错误页面可以像其他任何例外一样呈现给用户。

可能?

6 个答案:

答案 0 :(得分:5)

即使您定义了错误页面,也会有许多错误“突破”。例如。将控件拖到自身上时。安全似乎是另一个领域所有这些都是你应该在开发中处理的东西。我没有看到“通常”发生的错误(开发完成后的真正运行时和测试类型的错误)转义自定义错误页面。除此之外,遵循Declan的建议。

答案 1 :(得分:5)

你的代码中的try / catch块越多越好(理所当然):

try {
 // code that might throw an error
} catch (e) {
 // examine the error to see if there's a workaround
 // if not, log it and inform the user
} finally {
 // any code that needs to run whether or not there was an error
}

这种方式如果出现故障,它会优雅地失败。只要确保向用户明确说明出现了问题(并且,最好是向他们提供他们实际可以跟进的说明)...如果出现问题并且用户认为出现问题,那么默默地失败甚至比丑陋的错误页面更糟糕一切都很好。

P.S。正如斯蒂芬所指出的,有些错误根本无法捕获。例如,如果XPage没有被有权运行XPage的人签名,它甚至都没有尝试运行你的代码......页面本身是无效的,所以在运行时你无能为力。始终确保在部署期间签署了XPage。

答案 2 :(得分:4)

我遇到了类似的问题,我的错误页面没有显示,而是会显示错误500页。

我发现我的错误页面也存在问题,因此渲染器无法显示原始页面的错误,而是获得服务器默认错误页面。

检查这是否是导致您的特定问题的最佳方法是从一个简单的错误页面,没有主题,没有ssjs库,页面上没有ssjs代码等开始,只是一个带有一些静态文本的空白xpage表明它是错误页面。

一旦你可以确认这是错误500的可能原因,那么你就可以开始构建那个错误页面并一点一点地添加动态内容,直到你需要它为止。

答案 3 :(得分:2)

Dmytro Pastovenskyi有一篇关于Domino中错误页面的文章http://dpastov.blogspot.com/2012/01/error-pages-in-domino.html

为了安全起见,我有一个静态的html页面,上面写着“发生错误”。此页面由服务器上notes.ini中的HTTPMultiErrorPage设置引用。

然后有一个“HTTP响应头”规则解决特殊错误代码。

主要问题仍然是,这些是全局设置。因此,没有简单的方法来捕获专门针对您的应用程序的所有错误。但至少用户不会得到这个烦人的白色错误页面。

答案 4 :(得分:1)

我遇到过类似的问题。从某些底层错误冒出的错误消息会覆盖应用程序的已定义错误页面。这不是一个好的行为(从用户的角度来看),让你感觉有点赤裸裸。我确实理解应用程序很难捕获那些 - 但至少应该有一种方法来自定义该消息 - 默认错误500页对普通用户来说并不是非常有用...

尝试避免你的代码抛出这样的错误(ssjs / java)的唯一(?)方法是(如Tim Tripcony已经提到的)总是在代码周围使用try / catch语句(你已经知道了:))

getDocumentByUNID()是一个方法的“好”示例,它将导致显示丑陋(但标准)的错误500页面而不是应用程序中定义的错误页面。

对于任何其他错误类型(系统/安全性等) - 我认为不可能将它们重定向到(由用户)调用的应用程序错误页面,因为它们不是从应用程序调用,而是在应用程序被调用(我希望我错了)。

答案 5 :(得分:0)

创建一个名为error.xsp的新XPage(例如)。把那些出错的基本信息放在那里,为这个事实道歉并提供一些链接如何继续工作(即使他/她的数据可能永远丢失 - history.go(-1)通常无法解决问题) 。在后台,您可以记录错误(建议使用OpenLog)。

打开“应用程序属性”,“XPage”选项卡。取消选中显示XPage运行时错误页面。在组合错误页面中选择您的页面(错误)。