【问题标题】:Handle Exception and Error Page in Servlet处理 Servlet 中的异常和错误页面
【发布时间】:2019-10-08 19:54:19
【问题描述】:

通过使用浏览器,当出现错误时,我会正确地重定向到 web.xml 文件中指定的自定义错误页面

但为什么我总是在 curl 的输出中看到 default 400 错误页面及其跟踪?我缺少处理的异常类型(我正在使用 java.lang.Exception)或其他类型?

这是servlet的代码:

package test.company.com;

import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.Exception;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try {
  // stuff here ..

} catch (Throwable e) {
    // Log and throw the superclass Exception 
    LOGGER.log(Level.SEVERE, e.getMessage());
    throw new ServletException();
} 

}

这是 web.xml 配置文件:

<error-page>  
  <exception-type>javax.servlet.ServletException</exception-type>  
    <location>/error.jsp</location>  
  </error-page>
  <error-page>
  <exception-type>java.lang.Exception</exception-type>  
    <location>/error.jsp</location>  
  </error-page>
  <error-page>
    <error-code>400</error-code>
    <location>/error.jsp</location>
  </error-page> 
  <error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
  </error-page> 
  <error-page>
    <error-code>500</error-code>
    <location>/error.jsp</location>
  </error-page>

【问题讨论】:

    标签: java exception servlets error-handling


    【解决方案1】:

    在此处查看前两个答案:Which characters make a URL invalid? - 您正在从命令行发送 &lt;aaa&gt;,并且 URL 中不允许使用 &lt;&gt;。当您将这些字符输入地址字段时,浏览器会自动将这些字符编码为%3C%3E 实体,但curl 不会 - 它希望您知道自己在做什么。 ;-) 因此,Tomcat 甚至不会调用您的 servlet,而是以错误请求(错误 400)进行响应。

    因此,在命令行中将 &lt;aaa&gt; 替换为 %3Caaa%3E,然后您将访问您的 servlet(可能还有预期的错误 500)。

    【讨论】:

    • 假设您是一个黑帽黑客,并且您想触发托管 Web 应用程序的服务器,并且您尝试使用 curl 或 burp 拦截请求并删除由执行的 URL 编码来模糊参数浏览器。从开发人员的角度来看,您希望通过设置通用错误页面并删除所有错误堆栈跟踪来避免提供有关目标的信息。为什么即使我为所有 HTTP 400 响应状态代码设置了自定义页面,Tomcat 也会给我堆栈跟踪?问题是关于这个:)
    • 啊,好吧,我的错。那么答案就在这里:stackoverflow.com/a/55702749/3511123(TL;DR - 您必须在server.xml 中定义 400 的错误页面,而不是在 web.xml 中)。
    【解决方案2】:

    通过在Tomcat 9的server.xml中设置ErrorReportValve配置类解决,现在错误堆栈跟踪不再可用:-)

    【讨论】:

      猜你喜欢
      • 2014-05-11
      • 2013-05-03
      • 2017-04-05
      • 2018-02-03
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多