71

デフォルトでは、TomcatはHTTP 404のようなものに遭遇した場合、HTMLコンテンツをクライアントに送り返します。このコンテンツをカスタマイズするようにを介しweb.xml<error-page> 構成できることを私は知っています。

ただし、Tomcatには応答コンテンツに関して何も送信しないようにしたいと思います(もちろん、ステータスコードも必要です)。これを簡単に構成する方法はありますか?

A)サーブレットからの応答ストリームで空のコンテンツを明示的に送信すること、およびB)のHTTPエラーステータス全体に対してカスタムエラーページを構成することを回避しようとしていますweb.xml

いくつかの背景として、私はHTTP APIを開発していて、自分の応答コンテンツを制御しています。たとえば、HTTP 500の場合、エラー情報を含む応答にXMLコンテンツを入力しています。HTTP 404のような状況では、HTTP応答ステータスはクライアントにとって十分であり、Tomcatが送信しているコンテンツは不要です。別のアプローチがある場合、私はそれを聞いてオープンです。

編集: 継続的な調査の後、私はまだ解決策の方法で多くを見つけることができません。誰かがこれが不可能であると明確に言うことができる場合、またはそれが機能しないという証拠をリソースに提供することができる場合、私はそれを答えとして受け入れ、それを回避しようとします。

4

8 に答える 8

46

Tomcat にエラー ページを表示させたくない場合は、sendError(...) を使用しないでください。代わりに setStatus(...) を使用してください。

たとえば、405 応答を返したい場合は、次のようにします。

response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);      
response.getWriter().println("The method " + request.getMethod() + 
   " is not supported by this service.");

また、サーブレットから例外をスローしないことを忘れないでください。代わりに、Exception をキャッチし、statusCode を自分で設定します。

すなわち

protected void service(HttpServletRequest request,
      HttpServletResponse response) throws IOException {
  try {

    // servlet code here, e.g. super.service(request, response);

  } catch (Exception e) {
    // log the error with a timestamp, show the timestamp to the user
    long now = System.currentTimeMillis();
    log("Exception " + now, e);
    response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    response.getWriter().println("Guru meditation: " + now);
  }
}

もちろん、コンテンツが必要ない場合は、ライターに何も書き込まず、ステータスを設定するだけです。

于 2009-09-20T13:39:30.910 に答える
13

Tomcat がエラー本文を送信するのを簡単に停止するには、少し汚れていますが、Tomcat ホストに対して setErrorReportValveClass を呼び出す方法があります。すなわち:

public class SecureErrorReportValve extends ErrorReportValve {

@Override
protected void report(Request request,Response response,Throwable throwable) {
}

}

そしてそれを次のように設定します:

  ((StandardHost) tomcat.getHost()).setErrorReportValveClass(yourErrorValveClassName);

メッセージを送信したいが、Tomcat がそれを台無しにするべきではないと思う場合は、次のようなものが必要です。

@Override
protected void report(final Request request, final Response response, final Throwable throwable) {
    String message = response.getMessage();
    if (message != null) {
        try {
            response.getWriter().print(message);
            response.finishResponse();
        } catch (IOException e) {
        }
    }
}
于 2011-11-17T11:12:20.920 に答える
10

サーブレット仕様に準拠していますが、セキュリティ上の理由から、Tomcat やその他のサーブレット コンテナーからエラーの詳細を送信したくありません。これにも少し苦労しました。検索して試した後、解決策は次のように要約できます。

  1. 他の人が述べたように、使用しないでください、代わりに使用してください(sendError()Jerseyフレームワークでは選択できますsetStatus()
  2. ただし、 Spring Security の使用などのフレームワークsendError()...
  3. それを書いてFilterください
    sendError()への呼び出しをsetStatus()
    bにリダイレクトします。最後にレスポンスをフラッシュして、コンテナがレスポンスをさらに変更するのを防ぎます

これを行うサーブレット フィルタの小さな例は、ここにあります

于 2013-01-16T09:47:18.837 に答える
9

Heikkiが言ったように、代わりにステータスを設定するsendError()と、Tomcatは応答エンティティ/本体/ペイロードに触れません。

私の場合のように、エンティティなしで応答ヘッダーのみを送信する場合は、

response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentLength(0);

トリックを行います。Content-Length: 0を使用するとprint()、次のように使用しても効果がありません。

response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentLength(0);
response.getWriter().print("this string will be ignored due to the above line");

クライアントは次のようなものを受け取ります。

HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 0
Date: Wed, 28 Sep 2011 08:59:49 GMT

エラーメッセージを送信する場合は、setContentLength()withメッセージの長さ(ゼロ以外)を使用するか、サーバーに任せることができます

于 2011-09-28T09:04:55.307 に答える
2

<error-page>で要素を構成するweb.xml

編集$CATALINA_HOME/conf/web.xmlし、最後に次を追加し<error-page>、保存してTomcatを再起動します

<web-app>

...
...
...

    <error-page>
        <error-code>404</error-code>
        <location>/404.html</location>
    </error-page>

    <error-page>
        <error-code>500</error-code>
        <location>/500.html</location>
    </error-page>

    <error-page>
        <error-code>400</error-code>
        <location>/400.html</location>
    </error-page>

</web-app>
  • 指定された値に対して有効なルートを実際に作成していなくても、期待どおりにうまく機能しlocationます(例/400.html

ここに画像の説明を入力

ここに画像の説明を入力

于 2018-11-28T08:15:57.007 に答える
2

この質問は少し古いですが、私もこの問題に遭遇しました。まず第一に、Tomcat の動作は完全に正しいです。これはサーブレット仕様ごとです。仕様に反して Tomcat の動作を変更するべきではありません。Heikki Vesalainen と mrCoder が述べたように、setStatusandsetStatusのみを使用します。

のドキュメントを改善するために、Tomcatでチケットを発行しましたsendError

于 2012-11-23T21:16:34.473 に答える
1

<error-page>空の HTML ページで要素を構成しないのはなぜですか?

于 2009-04-27T17:51:03.550 に答える