我有一个非常简单的servlet,它包含以下代码来构建响应:
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType(CONTENT_TYPE);
final PrintWriter out = response.getWriter();
// ...
我的声纳提出了一个关键问题:"Exceptions should not be thrown from servlet methods"。 Sonar解释说,抛出这些异常是一个坏主意:
无法捕获servlet中的异常可能会导致系统处于异常状态 易受攻击的状态,可能导致拒绝服务攻击,或 敏感信息的暴露,因为当servlet抛出一个 异常,servlet容器通常发送调试信息 回到用户。这些信息对于一个人来说非常有价值 攻击者。
但是,如果我理解他们的例子,我无法想象如何巧妙地管理response.getWriter()上的潜在IOException。
有些人可以在此声明引发异常时向我解释,以及如何/为什么通过我们自己管理它很重要?
编辑: 尽管我有点沮丧,但我接受了第一个答案。我很清楚,让servlet容器管理此异常是一种不好的做法,因为默认行为会将堆栈跟踪和可能的其他敏感信息暴露给全世界。 就我而言,HTTP端点用于内部监控。所以在我的情况下,我想公开(相关)信息,问题是如果我没有PrintWriter我该怎么做...
我做了什么:我的程序打印错误日志,并返回没有内容的HTTP错误代码。我不知道它是否真的会发生......但是声纳和我很高兴。
答案 0 :(得分:1)
通过在servlet中抛出异常,可以向世界公开stacktrace和其他可能的敏感信息。您应该捕获异常并打印/显示一条很好的错误消息。
答案 1 :(得分:-1)
这很简单:假设您的服务所有的消费者都是白痴,并且需要使用小孩手套 - 这意味着向他们发送格式正确的错误消息,其中包含您选择的描述,而不是整个异常。