15.11.2013

Anwendungsübergreifende Fehlerseiten im Apache Tomcat

Werden auf dem Tomcat viele einzelne Anwendungen bereit gestellt, steht im Normalfall jede Anwendung in der Pflicht eine eigene, bestenfalls der CI angepasst, Fehlerseite bereit zu stellen. Ab einer gewissen Menge von Anwendungen ist es allerdings außerordentlich mühsam diese im Nachhinein zu integrieren, zu pflegen, geschweige denn alle Versionen auf dem gleichen Stand zu halten.


Einfacher wäre es doch, wenn eine zentrale Custom-Fehlerseite zu sehen ist.  Die gute Nachricht? Der Tomcat liefert ja bereits solche Fehlerseiten aus! Die schlechte Nachricht allerdings ist, dass die Seiten nicht so leicht änderbar sind.



Warum nicht? Die Fehlerseiten, die an dieser Stelle zu sehen sind, werden direkt aus einem Valve heraus erzeugt. Per Default werden die Ausgaben vom org.apache.catalina.valves.ErrorReportValve erzeugt. Dieser sorgt in der Methode protected void report(Request request,Response response,Throwable throwable) dafür, dass die bereits bekannten Fehlerseiten gerendert werden. Und genau an dieser Stelle muss angesetzt werden, wenn die Standard-Fehlerseiten nicht mehr gerendert werden sollen.

In der server.xml wird der Host konfiguriert, und genau diesem kann das Attribut errorReportValveClass mitgegeben werden. Die dort angegeben Klasse muss auf dem Classpath des Tomcat verfügbar sein und das Interface Valve implementieren. Es wird also ein einfaches Maven-Projekt erstellt:


Für die Implementierung sind noch weitere Dependencies notwendig, die natürlich ergänzt werden müssen.


Die aus diesen Dependencies bezogenen Klassen werden natürlich später vom Tomcat selbst bereitgestellt, so dass an dieser Stelle der <scope> auf provided gestellt wird.

Die Implementierung des eigenen ErrorReportValves ist straight-forward. Im ersten Schritt wird nichts anderes gemacht, als von der eigentlichen Implementierung geerbt.


Damit ist nicht wirklich mehr erreicht, als dass weiterhin die Anzeige der Standard-Fehlerseite realisiert wurde. Die Implementierung hat sich nicht geändert. Daher wird nun die bereits erwähnte Methode protected void report(Request request,Response response,Throwable throwable) überschrieben.



In dieser - eigenen - Implementierung wird die Ausgabe von dem Entwickler selbst erzeugt. Natürlich deutlich minimalistischer als die Standard-Fehlerseiten. Das Artefakt wird nun paketiert und auf dem Classpath des Tomcat bereitgestellt.


Nun fehlt nur noch der Eintrag in der server.xml ...


... und schon kann ein erneuter Test durchgeführt werden.


Somit ist erkennbar, dass die neue Konfiguration erfolgreich war. Die Fehlerbehandlung wird nun von dem CustomErrorReporterValve durchgeführt. Nun ist die einfache Ausgabe eines Fehlertextes noch nicht wirklich spannend, denn das Ziel ist ja eigentlich, dass die Default-Fehlerseiten des Tomcats aufgepeppt werden.

Im CustomErrorReporterValve ist es vollkommen egal welche Rückgabe wir an den Browser liefern, so dass wir auch text/html ausliefern können. Es wird also eine einfache Webseite erstellt, diese im resource-Verzeichnis des JARs hinterlegt und mit im Tomcat ausgeliefert. Die Methode zur Auslieferung der Fehlerseite wird etwas erweitert...



... und schon ist die Fehlerseite deutlich individueller gestaltet.

 

Mit dieser Konfiguration ist es also sehr leicht möglich, dass alle Anwendungen die in einem Tomcat bereitgestellt werden auf eine zentral konfigurierte und bereitgestellte Fehlerseite geleitet werden. Die Anwendungen müssen selbst keine weiteren Fehlerseiten mitbringen und können sich ganz allein auf die Standardmechanismen des Tomcat verlassen.

Keine Kommentare:

Kommentar veröffentlichen