3

ユーザーが間違ったユーザー/パスワードで認証すると、カスタム エラー 403 (禁止) をスローする Java サーブレットがあります。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」と表示されます。

カスタム メッセージを取得する簡単な方法はありますか?

4

1 に答える 1

4

サーブレット側から見ると、これは仕様に完全に準拠していHttpServletResponse#sendError()ます。

指定されたステータスを使用してクライアントにエラー応答を送信し、バッファをクリアします。サーバーはデフォルトで、指定されたメッセージを含むHTML形式のサーバーエラーページのように見える応答を作成し、コンテンツタイプを「text/html」に設定します。

したがって、クライアント(.net)側でHTMLを自分で解析する以外に方法はありません。


例外メッセージのみ403.jspを含むカスタムエラーページを作成できます

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

次のように指定しweb.xmlます。

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

そのため、応答本文全体がすでに例外メッセージ全体になっています。ただし、これは、サーブレットサービスが通常のWebブラウザによっても呼び出される場合は常に不利になる可能性があります。メッセージのみまたは本格的なHTMLページを返すように、リクエスト属性に基づいて条件付きでJSP出力を制御したい場合があります。


私が考えることができるもう1つの方法は、カスタム応答ヘッダーとしても設定することです。

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"];
    // ...
}
于 2011-07-26T20:43:34.457 に答える