Как получить пользовательское сообщение об ошибке 403, выдаваемой сервлетом Java, который перехвачен как WebException в .net? - PullRequest
3 голосов
/ 27 июля 2011

У меня есть Java-сервлет, который выдает пользовательскую ошибку 403 (Запрещено), когда пользователь аутентифицируется с неверным именем пользователя / паролем. Код сервлета Java:

response.sendError(response.SC_FORBIDDEN, "Login Error: wrong password!");

На стороне .net я улавливаю ошибку через WebException, но когда я опрашиваю содержимое WebException, я не вижу пользовательского сообщения об ошибке входа в систему, если не выполню следующее:

catch (WebException e)
{
    HttpWebResponse resp = e.Response as HttpWebResponse;
    StreamReader reader = new StreamReader(resp.GetResponseStream());
    string respStr = reader.ReadToEnd();
    reader.Close();
}

Проблема в том, что respStr - это HTML-строка, которую я должен был бы затем проанализировать, чтобы получить «Ошибка входа: неверный пароль!» строка. Если я просто делаю электронное сообщение, все, что я вижу, это: «Удаленный сервер возвратил ошибку: (403) Запрещено».

Есть ли более простой способ получить пользовательское сообщение?

1 Ответ

4 голосов
/ 27 июля 2011

Со стороны сервлета это полностью соответствует спецификации HttpServletResponse#sendError() .

Отправляет клиенту сообщение об ошибке с использованием указанного состояния и очищает буфер.По умолчанию сервер создает ответ, похожий на страницу ошибок сервера в формате HTML, содержащую указанное сообщение, и устанавливает тип содержимого «text / html».

Так что на самом деле нет другого способа, кроме самого анализа HTML на стороне клиента (.net).


Вы можете создать пользовательскую страницу ошибок 403.jsp, которая содержит только сообщение об исключении

<%@page isErrorPage="true"%>
${exception.message}

и укажите в web.xml следующее:

<error-page>
    <error-code>403</error-code>
    <location>/403.jsp</location>
</error-page>

, так что все тело ответа является уже целым исключениемсообщение.Но это может быть невыгодно всякий раз, когда служба сервлета также вызывается обычными веб-браузерами.Возможно, вы захотите управлять выводом JSP условно на основе некоторого атрибута запроса, чтобы он возвращал либо только сообщение, либо полноценную HTML-страницу.


Еще одна альтернатива, о которой я могу подумать, - установить ее кактакже настраиваемый заголовок ответа.

String errorMessage = "Login Error: wrong password!";
response.setHeader("X-Error-Message", errorMessage);
response.sendError(HttpServletResponse.SC_FORBIDDEN, errorMessage);

(обратите внимание, что я исправил статическую ссылку, вызываемую для класса, а не для экземпляра)

В .netсторона, чтобы сделать пользовательский заголовок:

catch (WebException e)
{
    HttpWebResponse resp = e.Response as HttpWebResponse;
    string errorMessage = resp.Headers["X-Error-Message"];
    // ...
}
...