Пересылка запроса на страницу ошибок Tomcat - PullRequest
1 голос
/ 31 августа 2011

В моем web.xml есть следующее:

    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error/exception</location>
    </error-page>

Путь /error/exception - это сервлет.

У меня вопрос: есть ли способ переслать запрос, вызвавший исключение, на страницу ошибки, определенную в файле web.xml?

1 Ответ

2 голосов
/ 01 сентября 2011

Выше создается новый запрос

Это не правда. Если, конечно, вы не отправляете перенаправление внутри сервлета, но это будет слишком очевидной ошибкой.


Мне нужно тело запроса, вызвавшего исключение.

Тело запроса может быть прочитано только один раз. Клиент не собирается отправлять его снова, когда вы захотите прочитать его еще раз. В случае обычных запросов application/x-www-form-urlencoded POST сервер будет считывать и анализировать тело запроса в параметры запроса, как вы получаете по HttpServletRequest#getParameterMap(). Если вы не хотите отображать все параметры запроса в хорошем списке / таблице по какой-то неочевидной причине, то вы также можете просто восстановить тело запроса на основе карты параметров запроса. Э.Г.

String requestBody = toQueryString(request.getParameterMap());
// ...

с

public static String toQueryString(Map<String, String[]> params) {
    StringBuilder queryString = new StringBuilder();

    for (Entry<String, String[]> param : params.entrySet()) {
        for (String value : param.getValue()) {
            if (queryString.length() > 0) {
                queryString.append("&amp;");
            }

            queryString
                .append(URLEncoder.encode(param.getKey(), "UTF-8"))
                .append("=")
                .append(URLEncoder.encode(value, "UTF-8"));
        }
    }

    return queryString.toString();
}

В случае multipart/form-data запросов, это зависит от того, как вы анализируете тело запроса и храните данные. Реконструкция также менее тривиальна.

Если вы хотите полностью прозрачное решение, рассмотрите HttpServletRequestWrapper, который копирует тело запроса в локальный (байтовый) буфер (или временный файл, когда он превышает определенный порог) всякий раз, когда вызывается getInputStream() или getReader(). Затем просто приведите HttpServletRequest к вашей реализации оболочки и возьмите эту копию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...