在 Servlet 中处理异常和错误页面
Handle Exception and Error Page in Servlet
通过使用浏览器,当抛出错误时,我被正确地重定向到 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>
请在此处查看前两个答案:Which characters make a URL invalid? - 您正在从命令行发送 <aaa>
,[=24= 中不允许使用 <
和 >
].当您将这些字符输入地址字段时,浏览器会自动将这些字符编码为 %3C
和 %3E
实体,但 curl
不会 - 它希望您知道自己在做什么。 ;-) 因此,Tomcat 甚至不调用您的 servlet,并以错误请求(错误 400)响应。
因此,在命令行中将 <aaa>
替换为 %3Caaa%3E
,您将到达您的 servlet(并且可能出现预期的错误 500)。
通过在 Tomcat 9 的 server.xml
中设置 ErrorReportValve
配置 class 解决,现在错误堆栈跟踪不再可用:-)
通过使用浏览器,当抛出错误时,我被正确地重定向到 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>
请在此处查看前两个答案:Which characters make a URL invalid? - 您正在从命令行发送 <aaa>
,[=24= 中不允许使用 <
和 >
].当您将这些字符输入地址字段时,浏览器会自动将这些字符编码为 %3C
和 %3E
实体,但 curl
不会 - 它希望您知道自己在做什么。 ;-) 因此,Tomcat 甚至不调用您的 servlet,并以错误请求(错误 400)响应。
因此,在命令行中将 <aaa>
替换为 %3Caaa%3E
,您将到达您的 servlet(并且可能出现预期的错误 500)。
通过在 Tomcat 9 的 server.xml
中设置 ErrorReportValve
配置 class 解决,现在错误堆栈跟踪不再可用:-)