You can access the resources which are available for one servlet context from the other. Let’s say you have two web applications deployed (in the same Servlet container):
- /myApp1
- /myApp2
Basically, if you’re in /myApp1
and you will execute the getServletContext()
method on ServletRequest
object,
it will return the ServletContext
for the application related with this ServletRequest
object (in this case – /myApp1).
With the ServletContext
object you can execute getResource(-)
or getResourceAsStream(-)
to get access to the
needed resource from within the /myapp1
application.
But what if you would like to get some resource which is available only in /myApp2
context, from the /myApp1
context?
It occurs that there is a way to achieve it, as there is a getContext(String uripath)
method in ServletContext
object, which allows you to get a ServletContext
object related with the uripath
passed as a parameter. What’s
important, that there is a possibility that your Servlet container is preventing such application cross-access
operations because of the security reasons. For example in Tomcat 7 you need to set appropriate attribute
(crossContext="true"
) for <Context>
element in TOMCAT_HOME/conf/context.xml
file. If you won’t do this,
the default value will be “false”.
So, basically what you want is this:
<?xml version='1.0' encoding='utf-8'?>
<Context crossContext="true">
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
Now assume that you have a file you want to access (and read) from within the /myApp1 application, which is located in
/myApp2/WEB-INF/myFile.txt
. This how the code could look somewhat like this:
// Without crossAuth="true" in context.xml, Tomcat 7 would return null.
ServletContext ctx = request.getServletContext().getContext("/myApp2");
// Get the resource from different ServletContext
InputStream resource = ctx.getResourceAsStream("/WEB-INF/myFile.txt");
// The main goal is achieved - we have an access to the resource; the rest of
// the code is purely standard InputStream access code - just to see it
// actually works.
BufferedInputStream bis = new BufferedInputStream(resource);
byte[] b = new byte[100];
bis.read(b, 0, 100);
Also notice, that you can obtain the RequestDispatcher
either from the ServletRequest
or the ServletContext
. Hence, you can use the above approach if
you would like to dispatch the request for processing to a different application.
Reference: