如何解决从response.getWriter()

时间:2016-08-30 14:22:06

标签: servlets sonarqube

我有一个非常简单的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错误代码。我不知道它是否真的会发生......但是声纳和我很高兴。

2 个答案:

答案 0 :(得分:1)

通过在servlet中抛出异常,可以向世界公开stacktrace和其他可能的敏感信息。您应该捕获异常并打印/显示一条很好的错误消息。

答案 1 :(得分:-1)

这很简单:假设您的服务所有的消费者都是白痴,并且需要使用小孩手套 - 这意味着向他们发送格式正确的错误消息,其中包含您选择的描述,而不是整个异常。