Tomcat 5 und crosscontext-Konfiguration
Manchmal ist es sinvoll, aus einem Context in Tomcat auf einen Anderen zuzugreifen. zum Beispiel dann, wenn eine CMS-Applikation getrennt von statischen, von Benutzern gepflegten Ressourcen gehalten werden soll.
Zugriff von einem Context auf einen anderen über die Servlet-API
Will man von einem anderen Context auf einen anderen zugreifen, lässt sich der gewünschte Context recht einfach aus dem ServletContext erhalten:
...
ServletContext otherContext = servletContext.getContext("/othercontext");
// The context may be null if the application server does not permit cross-context access.
if (otherContext != null) {
...
}
...
Wobei man sich den aktuellen Context beispielsweise über einen Listener oder Filter besorgen kann.
Zugriff ermöglichen: Context-Konfiguration in tomcat
Im tomcat application server liefert der Aufruf dieser Methode jedoch stets null zurück – Die Sicherheitseinstellungen von tomcat lassen den Zugriff auf andere Webapps per default nicht zu.
Der Zugriff funktioniert erst, wenn im Context, aus welchem man auf die anderen Contexts zugreifen möchte, das Attribut crossContext auf true gesetzt ist.
<Context path="[Pfad]" crossContext="true" ... />
(siehe dazu die Context-Doku von tomcat 6).
Allerdings funktioniert diese Konfiguration erst ab tomcat 6 ohne Schwierigkeiten. in Tomcat 5 gibt es eine Reihe von Bugs, insbesondere dann, wenn die crosscontext-webapp die ROOT-webapp ist. Damit crossContext im 5′er-Tomcat läuft, darf das path-Attribut nicht auf “/” gesetzt sein (Dies ist ohnehin ein ärgerlicher Verstoss gegen die servlet-Spezifikation), sonder muss “” lauten. Ansonsten greift crossContext=”true” nicht.
Demenstprechend sähe eine context-Konfiguration für die ROOT-webapp so aus:
<Context path="" crossContext="true" ... />
Wer jedoch WAR-Deployment
im 5′er Tomcat verwendet wird nun feststellen müssen, dass tomcat die WAR-Dateien nicht mehr entpackt und die Applikation nicht mehr ausliefert – ohne eine Fehlermeldung.
Dieses Verhalten lässt sich erst dadurch beheben, dass man als appBase-Attribut den Dateinamen des .war-Archives angibt, welches unter $CATALINA_BASE/webapps deployt ist, bspw. ROOT.war:
<Context path="" crossContext="true" appBase="ROOT.war" />
Jetzt wird auch die .war-Datei wieder entpackt.
Dummerweise ist es nun möglich, dass Tomcat die welcome-files (index.jsp) nicht mehr beim Aufruf von “/” ausliefert, was weitere workarounds nach sich zieht.
Fazit
Wer crossContext-Zugriffe benötigt, ist gut beraten, den aktuellen tomcat 6 zu verwenden bzw. auf diesen umzusteigen – erst die 6′er Reihe verhält sich diesbezüglich spezifikationsgemäss.
This entry was posted on Thursday, January 31st, 2008 at 15:22. Posted in: J2EE, System architecture, java, tomcat. You can follow any responses to this entry through the RSS 2.0feed. You can leave a response, or trackback from your own site.
