Einstellung sowohl der Fehlermeldung als auch der Nachricht vom Servlet

8

Ich möchte ein Servlet schreiben, das eine HTTP-Antwort wie folgt zurückgibt:

%Vor%

Der Grund ist, dass ich möchte, dass ein programmgesteuerter Client die Antwortnachricht verarbeiten kann, um eine bestimmte Antwort zu erhalten, aber ich möchte auch den Antworttext mit einer längeren Erklärung ausfüllen, so dass es einfach ist, mit einem Browser zu klicken / p>

Nun hat HttpServletResponse eine Methode sendError (int, String), mit der ich den Fehlercode und eine Nachricht angeben kann. Die Javadocs sagen nur, dass die Nachricht in irgendeine Art von HTML-Seite eingebettet wird, aber nichts über das Setzen der HTTP-Antwortnachricht. Nachdem Sie diese Methode aufgerufen haben, dürfen Sie nichts mehr in die Antwort schreiben. In meinen Tests (mit Anlegesteg) wird die Nachricht sowohl für die HTTP-Antwort als auch für einen HTML-Text verwendet, was für mich in Ordnung wäre, außer dass ich zwei verschiedene Zeichenfolgen angeben möchte und die Einstellung der http-Antwort nicht denke Nachricht wird mit einer anderen Implementierung garantiert.

Es gibt auch eine setStatus (int) -Methode, die Sie mit beliebigem Code aufrufen können, und dann können Sie Ihren eigenen HTML-Text schreiben. Dies ist nahe, außer dass Sie die HTTP-Antwortnachricht nicht angeben können.

Schließlich gibt es eine setStatus (int, String) -Methode, die tatsächlich genau das tut, was ich will, aber wegen einiger Unklarheiten veraltet ist. Ich nehme an, dass einige Servlet-Container die Nachricht in den Antworttext geschrieben und die Antwort geschlossen haben.

Abgesehen davon, dass ich die veraltete Methode verwende, gehe ich davon aus, dass ich hier versaut bin, aber ich bin neugierig, ob jemand andere Tricks kennt?

    
Jeremy Huiskamp 07.10.2010, 20:42
quelle

6 Antworten

9
  

Es gibt auch eine setStatus (int) -Methode, die Sie mit beliebigem Code aufrufen können, und dann können Sie Ihren eigenen HTML-Text schreiben. Dies ist nahe, außer dass Sie die HTTP-Antwortnachricht nicht angeben können.

Gibt es einen Grund, warum Sie response.setStatus(500) nicht verwenden würden, um den HTTP-Statuscode festzulegen, gefolgt vom Schreiben in den Ausgabestream der Antwort?

So wird "Schreiben in den Antworttext" auf der untersten Ebene erreicht.

Hier ist ein Beispiel:

%Vor%

web.xml:

%Vor%

Und die Ausgabe:

%Vor%     
matt b 08.10.2010 01:52
quelle
5

Sie können Fehlerseiten anpassen, indem Sie in web.xml fehlerspezifische Seiten angeben:

%Vor%

In der JSP-Datei können Sie Anfrageattribute verwenden, um eine benutzerdefinierte Nachricht und andere Informationen anzuzeigen.

    
FRotthowe 07.10.2010 20:51
quelle
1

Nun, Entschuldigung, der offensichtlichste Grund, einen Body für eine Fehlerreaktion zu haben, besteht darin, etwas Menschenlesbares in einem Browser anzuzeigen, wenn ein Fehler auftritt. Aus diesem Grund ist das Generieren von HTML das Standardverhalten von sendError in der Servlet-Spezifikation.

In meinem Fall möchte ich etwas anderes, weil ich Webdienste erstelle, und diese konkrete gibt keine Antwort zurück, wenn alles gut funktioniert.

    
Juan 19.07.2012 15:49
quelle
1

Scheint so, als ob alle APIs, die für die Einstellung der Grundphrase in HTTP entworfen wurden, aus diesem Grund obsolet werden:

RFC 7230, Hypertext-Übertragungsprotokoll (HTTP / 1.1): Nachrichtensyntax und Routing , Juni 2014. Abschnitt 3.1.2 :

  

Das Grundphrase-Element existiert nur zu dem Zweck, zu liefern   eine Textbeschreibung, die dem numerischen Statuscode zugeordnet ist,   meist aus Respekt gegenüber früheren Internet-Anwendungsprotokollen   Diese wurden häufiger bei interaktiven Textclients verwendet. A   Der Client sollte den Inhalt der Grundphrase ignorieren .

Tomcat hat die Unterstützung für org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER -Eigenschaft in Version 8.5.0 entfernt.

    
Jarekczek 13.05.2017 15:49
quelle
0

Wenn Sie eine benutzerdefinierte Fehlermeldung in den Kopfzeilen haben möchten, warum fügen Sie nicht Ihre eigene Kopfzeile mit response.addHeader(String, String) hinzu? Kombiniert mit der Antwort von matt b könnte das funktionieren.

    
nash 07.12.2011 16:09
quelle
0

Mit JBoss 6 kam ich zu dem Schluss, dass der Antwortcode gesetzt werden muss, nachdem Sie getWriter aufgerufen haben, um die Jboss-Antwort auf die benutzerdefinierte Fehlerseite zu deaktivieren. Ich denke, dass die Implementierung verschiedene Schreiber abhängig vom Status der Antwort zur Verfügung stellt.

%Vor%     
Elijah 11.12.2012 15:31
quelle

Tags und Links