Unterschied zwischen Sitzung.getServletContext() und session.getServletContext().getContext("/SampleProject")
Ich habe einen Tomcat 6-Instanz läuft auf meinem lokalen Rechner.
Ich habe die folgenden änderungen in der Konfiguration:
-
In /conf/
context.xml
– änderte sich der tag wie folgt<Context crossContext="true">
-
In /conf/
server.xml
– änderte sich der tag wie folgt<Connector port="8080" protocol="HTTP/1.1" emptySessionPath="true" connectionTimeout="20000" redirectPort="8443" />
Nehme an, dass ich eine war-Datei namens SampleProject.war
bereitgestellt hier, das extrahieren in Ordner SampleProject
.
In einigen servlet in diesem KRIEG, sagen SampleServlet
Schreibe ich zwei code-Blöcke wie folgt :
ServletContext context1 = session.getServletContext();
und
ServletContext context2 = session.getServletContext().getContext("/SampleProject");
Was ist der Unterschied zwischen context1
und context2
? Ich dachte, die beziehen sich beide auf den Anwendungskontext. Aber wenn ich ein Attribut in context1
und Zugang in context2
ich nicht bekommen, den Wert in context2
.
Jede mögliche Hilfe würde geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Spüre ich deine Frage wurde etwas falsch verstanden, und dass du schon das grundlegende Verständnis der API, d.h. nachdem Sie eine web-app setzt seinen
crossContext="true"
könnte esgetContext()
Zugang zu einem Kontext, der entspricht zu einigen anderen web-app die auf dem server bereitgestellt.Von dem, was ich verstanden habe, deine Frage eigentlich ist, dass in
/SameWebApp
warumIn nur einem Wort, die Antwort ist "Sicherheit". Vorstellen, wenn Sie konnte nicht garantieren, dass eine "adminEmail" context-Attribut nicht manipuliert wurde, indem ein böse web-app mit seiner
crossContext=true
. Ihre app möglicherweise helfen könnte gefährden sich selbst, sobald Sie auf "Passwort Vergessen" - Anfrage kommt! 🙂Einen Tauchgang in Tomcat Interna
Tomcat 7 bietet eine
class ApplicationContext implements ServletContext
dass Renditen vongetContext("/context-root")
alsHier
context
gehört zu aktuellen web-app und diechild
ist die andere web-app. Aber, halt, was macht Tomcat nennen es ein Kind?Diese beiden eigentlich gar nicht
ApplicationContext
aber Instanzen vonStandardContext
eine Klasse, dieimplements Context
sondern der servlet-spezifische Dinge hält Tomcat-spezifische config-Einstellungen für eine web-app wie crossContext, hostname, mimeMappings etc.StandardContext.getParent()
gibt Ihnen dieContainer
und daher verwiesen wurde, wie ein Kind vor.Egal, uns interessiert der Fall, wenn
child == context
wahr ist, d.h.getContext()
genannt wurde, auf die "/SameWebApp". Der Aufruf delegiertStandardContext.getServletContext()
das umgesetzt, um wieder eine andere Instanz vonApplicationContext
.Dies ist der Grund, warum die Attribute, die Sie in
context1
sind nicht incontext2
.Aber warten Sie, es gibt einige mehr. Warum
StandardContext.getServletContext()
Gegenzug, wieEiner Tomcat-Instanz ist grundsätzlich die Ausführung zwei Arten von Java-code:
Container code "Vertrauenswürdig" und müssen möglicherweise mit erhöhten Berechtigungen ausführen manchmal. Der Benutzer-code, auf der anderen Seite, ist nicht vertrauenswürdig und muss eingeschränkt werden, Kompromisse Tomcat-Interna.
Eines der Dinge, die Tomcat ist dies zu erreichen ist immer wickeln Sie ein
ApplicationContextFacade
rund um dieApplicationContext
(und damit dieStandardContext
auch). Also nur zur Erinnerung, was zu sein scheint eine einfacheServletContext
Umsetzung ist eigentlich eineStandardContext
zugeordnetApplicationContext
die dann eingewickelt in eineApplicationContextFacade
.Weitere Informationen, wie Sie die
ApplicationContextFacade
arbeitet mit Reflexion im tandem mitGlobals.IS_SECURITY_ENABLED
undSecurityUtil.isPackageProtectionEnabled()
Einstellungen werfen Sie bitte einen Blick auf Warum Servlets Zugriff auf Tomcat-Datei ApplicationContext durch eine Fassade auf SO.Referenzen:
Tomcat-7-Quellcode (Download-Link)
Absolut diese beiden Kontext-Objekte unterscheiden sich von anderen..
Context1 Objekt gibt die aktuelle web Anwendung servlet-Kontext obj.
( ServletContext context1 = Sitzung.getServletContext();)
und
context2-Objekt gibt den servletcontext obj der angegebenen web-Anwendung
(ServletContext context2 = Sitzung.getServletContext().getContext("/SampleProject");)
legen Sie ein Objekt in einem Kontext und beim abrufen mit einem anderen Kontext, so dass es nicht möglich ist, zu bekommen Attribut von einer anderen web-Anwendung Kontext, indem Sie es im aktuellen Anwendungskontext. Aber können Sie sich das Attribut befindet sich in einer anderen Webanwendung Zusammenhang mit der zweiten Methode.
Denken OO & java EE Plattform standards + Sicherheit.
Der erste Aufruf gibt die definitive servlet-Kontext für die aktuelle app, die mit allen Operationen unterstützt.
Dem zweiten Aufruf gibt ein kopieren der servlet-Kontext, der könnte für jede app. Wie gesagt (eher vage!) in der javadoc, es ist Zweck ist, zu ermöglichen, erhalten Sie eine
RequestDispatcher
, so können Sie den Versand an Seiten, die von anderen apps. Es ist anderen großen sondern implizite Anforderung besteht darin, diese sicher und zu respektieren, die Java-EE-specs, die nicht zulassen, dass die Freigabe der session-oder servlet-Kontext zwischen apps. Stellen Sie sich den schrecklichen Schaden "rogue App "B" tun, um "gute App", wenn es nur ändern könnte (oder Lesen) Servlet-Kontext-Daten von brute-force. Deshalb ist es eine Kopie.Also, Einstellung-Attribute, die auf das kopieren, führt nicht zu änderungen an der ursprünglichen. Man könnte argumentieren, dass die Kopie sollte werfen einige "Nicht Unterstützter Vorgang Ausnahme". Alternativ könnte man argumentieren, dass getRequestDispatcher sollte umgestaltet werden entweder in eine andere Klasse, oder zu ermöglichen, ein App-Kontext-URL übergeben werden. ... Aber, leider, keines dieser Dinge sind wahr. B^)