Frage

In der Standardeinstellung Tomcat sendet einig HTML-Inhalt an den Client zurück, wenn es so etwas wie eine HTTP begegnet 404. Ich weiß, dass über web.xml ein <error-page> kann anpassen diesen Inhalt konfiguriert werden.

Aber ich möchte nur für Tomcat nichts senden in Bezug auf die Antwortinhalt (ich würde immer noch wie der Statuscode, natürlich). Gibt es eine Möglichkeit, dies auf einfache Weise konfigurieren?

Ich versuche A zu vermeiden) explizit leeren Inhalt des Antwortstrom von meinem Servlet sendet und B) benutzerdefinierte Fehlerseiten für eine ganze Reihe von HTTP-Fehlerzuständen in meinem web.xml konfiguriert.

Für einig Hintergrund, Ich entwickle einen HTTP-API und bin Steuerung meines eigenen Antwortinhaltes. Also für einen HTTP-500, zum Beispiel, ich bevölkern einige XML-Inhalte auf die Antwort enthält Fehlerinformationen. Für Situationen, wie ein HTTP 404, ist der HTTP-Antwort-Status für Kunden ausreichend, und der Inhalt tomcat sendet, ist nicht notwendig. Wenn es ein anderer Ansatz ist, ist ich offen zu hören es.

Edit: Nach fortlaufender Untersuchung, kann ich viel in der Art einer Lösung finde immer noch nicht. Wenn jemand definitiv sagen kann, dies nicht möglich ist, oder eine Ressource mit den Nachweis erbringen, dass es nicht funktionieren wird, werde ich akzeptieren, dass als Antwort und versuchen, und arbeiten um ihn herum.

War es hilfreich?

Lösung

Wenn Sie nicht tomcat wollen eine Fehlerseite zeigen, dann verwenden Sie nicht sendError (...). Verwenden Sie stattdessen setStatus (...).

z. Wenn Sie eine 405-Antwort geben wollen, dann tun Sie

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

Auch nicht vergessen, keine Ausnahmen von Ihrem Servlet zu werfen. Statt die Ausnahme abfangen und wieder, stellen Sie den status Sie sich selbst.

d.

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);
  }
}

natürlich, wenn Sie keine Inhalte wollen, dann schreiben Sie einfach nichts an den Schriftsteller, setzen Sie nur den Status an.

Andere Tipps

Obwohl dies nicht reagiert exakt auf die Erklärung auf der Frage „nichts senden“, und auf der Welle des Clive Evans' beantworten , fand ich heraus, dass in tomcat Sie diese zu viel ausführliche Texte gehen weg von Fehlerseiten ohne das Erstellen eines benutzerdefinierten ErrorReportValve machen kann.

Sie können zu diesem Customizing ErrorReportValve durch den 2 params "showReport" und "showServerInfo" auf "server.xml" erreichen:

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

Link zur offiziellen Dokumentation .

für mich gearbeitet auf tomcat 7.0.55, nicht für mich arbeiten auf tomcat 7.0.47 (ich glaube, auf den folgenden Link http://www.mail-archive.com/users@tomcat.apache.org/msg113856.html )

Die schnelle, leicht schmutzig, aber einfache Möglichkeit, Tomcat stoppt jeden Fehler Körper senden ist setErrorReportValveClass gegen den Kater Host zu nennen, mit einem Bericht Ventil individueller Fehler, den Bericht nichts zu tun außer Kraft setzt. dh:

public class SecureErrorReportValve extends ErrorReportValve {

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

}

und legen Sie es mit:

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

Wenn Sie möchten, dass Ihre Nachricht senden, und man denke nur Tomcat sollte nicht mess with es, Sie wollen etwas entlang der Linien von:

@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) {
        }
    }
}

Wie Heikki sagte der Status statt sendError() Einstellung bewirkt, dass der Tomcat nicht die Antwort Einheit / Körper / Nutzlast berühren.

Wenn Sie nur wollen, ohne jede Einheit der Antwort-Header senden, wie in meinem Fall,

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

funktioniert der Trick. Mit Content-Length: 0 wird die print() keine Wirkung hat, selbst wenn verwendet, wie:

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

erhält der Kunde so etwas wie:

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

Wenn Sie einige Fehlermeldung senden möchten, verwenden Sie die setContentLength() mit Nachrichtenlänge (ungleich Null) oder Sie können es auf den Server verlassen

Obwohl es Servlet-Spezifikation kompatibel ist, aus Sicherheitsgründen möchte ich nicht Katers oder andere Servlet-Container Fehlerdetails zu senden. Ich kämpfte mit diesem auch ein wenig. Nach der Suche und versuchen, kann die Lösung wie folgt zusammengefasst werden:

  1. wie andere erwähnt, nicht verwenden sendError(), Verwendung setStatus() statt
  2. Frameworks wie z.B. Spring Security verwenden sendError() obwohl ...
  3. schreiben eine Filter dass
    ein. sendError() leitet Anrufe setStatus()
    b. spült die Reaktion am Ende von einem weiteren Modifizierung der Reaktion den Behälter zu verhindern

Ein kleines Beispiel Servlet-Filter dies zu tun hier gefunden werden kann.

Warum konfiguriert nicht nur das <error-page> Element mit einer leeren HTML-Seite?

Obwohl diese Frage ist ein bisschen alt, lief ich in diese zu Problem. Zunächst einmal ist Tomcat Verhalten absolut richtig. Dies ist pro Servlet Spec. Man sollte nicht Tomcat das Verhalten gegen die Spezifikation ändern. Als Heikki Vesalainen und mrCoder erwähnt, verwenden setStatus und setStatus nur.

Um wen es angeht, habe ich ein Ticket erhoben habe mit Tomcat die Dokumentation von sendError zu verbessern.

Konfigurieren <error-page> Elemente in web.xml

Bearbeiten $CATALINA_HOME/conf/web.xml, fügen Sie am Ende der folgenden <error-page>, speichern und neu starten 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>
  • Es funktioniert großartig, wie ich auch erwarten, obwohl ich nicht wirklich eine gültige Routen für die angegebenen location Werte (z /400.html)
  • erstellt haben

vor

nach

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top