デフォルトでは、TomcatはHTTP 404のようなものに遭遇した場合、クライアントにHTMLコンテンツを送り返します。web.xml
an <error-page>
設定可能 このコンテンツをカスタマイズします。
ただし、Tomcatには何も送信しないようにしたいだけです(もちろん、ステータスコードが必要です)。これを簡単に構成する方法はありますか?
A)サーブレットから応答ストリームで空のコンテンツを明示的に送信すること、およびB)web.xml
。
ある程度の背景として、HTTP APIを開発しており、自分の応答コンテンツを制御しています。たとえば、HTTP 500の場合、エラー情報を含む応答にXMLコンテンツを追加しています。 HTTP 404のような状況の場合、HTTP応答ステータスはクライアントにとって十分であり、Tomcatが送信するコンテンツは不要です。別のアプローチがある場合、私はそれを聞いてオープンです。
編集:継続的な調査を行った後、私はまだ解決策の多くを見つけることができません。誰かがこれは不可能だと断言できる場合、またはリソースが機能しないことを示す証拠を提供できる場合は、それを回答として受け入れ、回避してみます。
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);
}
}
もちろん、コンテンツが必要ない場合は、ライターに何も書き込まず、ステータスを設定するだけです。
これは、質問に関する「何も送信しない」ステートメント、および 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 )
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) {
}
}
}
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()
をメッセージ長(ゼロ以外)で使用するか、サーバーに任せることができます。
サーブレット仕様に準拠していますが、セキュリティ上の理由から、Tomcatや他のサーブレットコンテナがエラーの詳細を送信することは望ましくありません。私もこれに少し苦労しました。検索と試行後、ソリューションは次のように要約できます。
sendError()
を使用せず、代わりにsetStatus()
を使用してくださいsendError()
を使用しますが...Filter
を書くsendError()
への呼び出しをsetStatus()
にリダイレクトしますこの質問は少し古いですが、私もこの問題に遭遇しました。まず、Tomcatの動作は完全に正しいです。これはサーブレット仕様ごとです。 Tomcatの仕様に対する動作を変更しないでください。 Heikki VesalainenとmrCoderが述べたように、setStatus
とsetStatus
のみを使用してください。
懸念のある方には、Tomcatで ticket を上げて、sendError
のドキュメントを改善しました。
単に<error-page>
HTMLページが空の要素?
<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
)に対して有効なルートを実際に作成していなくても、期待どおりに機能します前
後