あなたの質問は少し誤解されていて、APIの基本的な理解はすでにあると思います。つまり、Webアプリが設定されると、サーバーにデプロイされた他のWebアプリに対応するコンテキストにアクセスするためにcrossContext="true"使用できるようになります。getContext()
getServletContext().getContext() equals NULL unless <Context crossContext="true">
私が理解したことから、あなたの質問は実際には/SameWebAppなぜですか
ServletContext context1 = session.getServletContext();
context1.setAttribute("contextAttribute", new Object());
ServletContext context2 = session.getServletContext().getContext("/SameWebApp");
System.out.println(context1.equals(context2)); // prints false, or
System.out.println(context2.getAttribute("contextAttribute")); // prints null (at least they could have been clones)
一言で言えば、答えは「セキュリティ」です。「adminEmail」コンテキスト属性が、そのを持つ邪悪なWebアプリによって改ざんされていないことを保証できない場合を想像してみてくださいcrossContext=true。「パスワードを忘れた場合」のリクエストが届くとすぐに、アプリが自分自身を危険にさらす可能性があります。:)
Tomcatの内部に飛び込む
Tomcat 7は、class ApplicationContext implements ServletContextとしてから戻るを提供しgetContext("/context-root")ます
if (context.getCrossContext()) {
// If crossContext is enabled, can always return the context
return child.getServletContext();
} else if (child == context) {
// Can still return the current context
return context.getServletContext();
} else {
// Nothing to return
return (null);
}
contextこれは現在のWebアプリに属しchild、他のWebアプリを表します。しかし、待ってください、Tomcatがそれを子と呼ぶ理由は何ですか?
これら2つは実際にはクラスApplicationContextのインスタンスではありませんが、サーブレット固有のものではなく、crossContext、hostname、mimeMappingsなどのWebアプリのTomcat固有の構成設定を保持するため、上記の子と呼ばれています。。StandardContextimplements ContextStandardContext.getParent()Container
とにかく、child == contexttrueの場合、つまりgetContext()「/ SameWebApp」で呼び出された場合に関心があります。の別のインスタンスをStandardContext.getServletContext()返すように実装された呼び出しが委任されています。ApplicationContext
context1これが、設定した属性がに見つからない理由ですcontext2。
しかし、待ってください、それにはもう少しあります。なぜStandardContext.getServletContext()のように戻るのですか
return (context.getFacade());
Tomcatインスタンスは、基本的に2種類のJavaコードを実行しています。
- 提供されるコンテナ、および
- ユーザーがデプロイされました
コンテナコードは「信頼できる」ものであり、昇格された特権で実行する必要がある場合があります。一方、ユーザーコードは信頼されておらず、Tomcatの内部を危険にさらすことを制限する必要があります。
これを実現するためにTomcatが行うことの1つは、常に(したがって)をラップApplicationContextFacadeアラウンドすることです。要約すると、単純な実装のように見えるのは、実際にはにマップされており、はにラップされています。ApplicationContextStandardContextServletContextStandardContextApplicationContextApplicationContextFacade
ApplicationContextFacadeReflectionGlobals.IS_SECURITY_ENABLEDとSecurityUtil.isPackageProtectionEnabled()設定を組み合わせて使用する動作の詳細については、サーブレットがSOのファサードを介してTomcatApplicationContextにアクセスする理由を参照してください。
参照:
Tomcat 7ソースコード(ダウンロードリンク)