問題のデモ: https://github.com/paul-hammant/servletDispatcherTest
Tomcat 6 と 7 を試しました。
概要: conf/context.xml を属性 'crossContext="true"' を持つように変更すると、1 つの war ファイル アプリが同じ Tomcat インスタンス内で別のアプリを利用できるようになります。動作しますが、期待どおりではありません。
上記の「a」と「b」のデモには、2 つの WAR ファイル Web アプリがあります。HTML ではなくテキストを吐き出すサーブレットは、それぞれに 1 つだけです。実際、現在のスレッドのオブジェクト ID を出力しようとするだけです。
/a/にアクセスしようとしたときにTomcatがページに出力するものは次のとおりです
message The requested resource (/b/anything) is not available
description The server encountered an internal error that prevented it from fulfilling this request.
exception
java.io.FileNotFoundException: The requested resource (/b/anything) is not available
org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:776)
org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:411)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
servletDispatcherTest.A.doFilter(A.java:31)
A.java および B.java のソースへのクイック URL: https://github.com/paul-hammant/servletDispatcherTest/blob/master/a/src/main/java/servletDispatcherTest/A.javaおよび https:// github.com/paul-hammant/servletDispatcherTest/blob/master/b/src/main/java/servletDispatcherTest/B.java
私は本当に次のような出力を期待しています:
A thread = 610988429
B thread = 610988429
/b/anything への直接アクセスは期待どおりに機能します。ディスパッチの試みがなければ /a へのアクセスも同様です。
ServletContext context = httpsr.getSession().getServletContext().getContext("/b");
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/anything");
requestDispatcher.include(request, response);