如何解决从response.getWriter()抛出的Sonar违规问题

mco*_*ive 6 servlets sonarqube

我有一个非常简单的 servlet,其中包含以下用于构建响应的代码:

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setContentType(CONTENT_TYPE);
    final PrintWriter out = response.getWriter();
    // ...
Run Code Online (Sandbox Code Playgroud)

我的 Sonar 提出了一个关于规则的关键问题:“Servlet 方法不应抛出异常”。Sonar 解释说,抛出此类异常是一个坏主意:

未能捕获 servlet 中的异常可能会使系统处于易受攻击的状态,可能导致拒绝服务攻击或敏感信息的暴露,因为当 servlet 引发异常时,servlet 容器通常会将调试信息发送回用户。这些信息对于攻击者来说可能非常有价值。

但如果我理解他们的例子,我就无法弄清楚如何巧妙地管理response.getWriter()上潜在的IOException。

有些人可以向我解释一下这个语句何时会引发异常,以及如何/为什么我们自己管理它很重要?

编辑:尽管我有点沮丧,但我还是接受了第一个答案。我非常清楚让 servlet 容器管理此异常是一种不好的做法,因为默认行为会向世界公开堆栈跟踪和可能的其他敏感信息。就我而言,HTTP 端点用于内部监控。所以就我而言,我想公开(相关)信息,问题是如果我没有 PrintWriter,我该如何做到这一点......

我做了什么:我的程序打印一个错误日志,并返回一个没有内容的 HTTP 错误代码。我不知道这是否真的会发生……但 Sonar 和我很高兴。

小智 1

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

  • 我知道我应该向客户端返回一条不错的错误消息。但是如果我不能在响应对象中写入,我该怎么办呢?同样,我不明白 getWriter 何时可以抛出 IOException。 (2认同)