Как получить пользовательское сообщение об ошибке 403, выдаваемой сервлетом Java, обнаруженным как исключение WebEx в.net?

У меня есть 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-строка, которую мне нужно было бы проанализировать, чтобы получить "Ошибка входа: неверный пароль!" строка. Если я просто делаю сообщение e.Message, все, что я вижу, это: "Удаленный сервер возвратил ошибку: (403) Forbidden".

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

1 ответ

Решение

Со стороны сервлета, это полностью соответствует 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"];
    // ...
}
Другие вопросы по тегам