web-dev-qa-db-ja.com

TomcatのすべてのデフォルトHTTPエラー応答コンテンツを無効にします

デフォルトでは、TomcatはHTTP 404のようなものに遭遇した場合、クライアントにHTMLコンテンツを送り返します。web.xml an <error-page>設定可能 このコンテンツをカスタマイズします。

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

A)サーブレットから応答ストリームで空のコンテンツを明示的に送信すること、およびB)web.xml

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

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

67
Rob Hruska

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

例えば405応答を返したい場合は、

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

また、サーブレットから例外をスローしないことを忘れないでください。代わりに、例外をキャッチし、再び、自分自身に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);
  }
}

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

44

これは、質問に関する「何も送信しない」ステートメント、および Clive Evansのanswer の波に正確に応答しませんが、 Tomcatでは、カスタムErrorReportValveを作成せずに、これらの冗長なテキストをエラーページから削除できます。

「server.xml」の2つのパラメーター「showReport」と「showServerInfo」を使用して、このカスタマイズしたErrorReportValveを実現できます。

<Valve className="org.Apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />

公式ドキュメントへのリンク

Tomcat 7.0.55で私のために働いたが、Tomcat 7.0.47では私のために働いていなかった(私は次のリンク http://www.mail-archiveで報告された何かのために思うcom/[email protected]/msg113856.html

36
reallynice

Tomcatがエラー本文を送信しないようにするための、迅速で少し汚い、しかし簡単な方法は、Tomcatホストに対してsetErrorReportValveClassを呼び出すことです。カスタムエラーレポートValveは、レポートをオーバーライドして何もしないようにします。すなわち:

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) {
        }
    }
}
10
Clive Evans

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()をメッセージ長(ゼロ以外)で使用するか、サーバーに任せることができます。

9
manikanta

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

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

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

8
Erich Eichinger

この質問は少し古いですが、私もこの問題に遭遇しました。まず、Tomcatの動作は完全に正しいです。これはサーブレット仕様ごとです。 Tomcatの仕様に対する動作を変更しないでください。 Heikki VesalainenとmrCoderが述べたように、setStatussetStatusのみを使用してください。

懸念のある方には、Tomcatで ticket を上げて、sendErrorのドキュメントを改善しました。

1
Michael-O

単に<error-page> HTMLページが空の要素?

1
matt b

<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)に対して有効なルートを実際に作成していなくても、期待どおりに機能します

enter image description here

enter image description here

0
Jossef Harush