Обработка страницы исключения и ошибки в сервлете

При использовании браузера, когда выдается ошибка, я правильно перенаправляюсь на пользовательскую страницу ошибки, указанную в файле веб.xml.

Но почему я всегда вижу страницу ошибки по умолчанию 400 с ее трассировкой в ​​выводе завиток? Мне не хватает типа обрабатываемого исключения (я использую java.lang.Exception) или другого?

enter image description here

Это код сервлета:

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
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
0
464
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

См. первые два ответа здесь: Какие символы делают URL-адрес недействительным? - вы отправляете <aaa> из командной строки, а < и > не разрешены в URL. Браузер автоматически кодирует эти символы в сущности %3C и %3E, когда вы вводите их в поле адреса, но curl этого не делает — он ожидает, что вы знаете, что делаете. ;-) Таким образом, Tomcat даже не вызывает ваш сервлет, а отвечает неверным запросом (ошибка 400).

Итак, замените <aaa> на %3Caaa%3E в командной строке, и вы получите свой сервлет (и, возможно, ожидаемую ошибку 500).

Предположим, вы черный хакер, и вы хотите запустить сервер, на котором размещено веб-приложение, и вы пытаетесь изменить параметры, используя, например, curl или burp, перехватывая запрос и удаляя кодировку URL, выполняемую браузером. С точки зрения разработчика вы хотите избежать предоставления информации о цели, установив общую страницу ошибок и удалив всю трассировку стека ошибок. Почему Tomcat дал мне трассировку стека, даже если я установил пользовательскую страницу для всех кодов состояния ответов HTTP 400? Вопрос об этом :)

user5120193 22.05.2019 13:55

Ах, хорошо, мой плохой. Тогда ответ здесь: stackoverflow.com/a/55702749/3511123 (TL;DR - вы должны определить страницу ошибки для 400 в server.xml, а не в web.xml).

Jozef Chocholacek 22.05.2019 15:05
Ответ принят как подходящий

Решено установкой класса конфигурации ErrorReportValve в server.xml Tomcat 9, теперь трассировка стека ошибок больше недоступна :-)

enter image description here

Другие вопросы по теме