在同一服务器中跨Web应用程序共享servlet上下文

时间:2011-10-25 15:36:39

标签: java tomcat servlets

我在一个运行在同一容器(Tomcat)中的单独Web应用程序中有两个servlet。让应用程序成为app1& app2,& servlet是serv1& serv2上。

我正在使用serv1(在app1中)来调用serv2(在app2中)。我也试图在这两个servlet之间共享一个相同的会话。下面是我的代码片段。

serv1(app1)

URLConnection connection = new URL("http://localhost:8080/app2/serv2").openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));  
HttpSession session = request.getSession(true);  
String sessionId = session.getId();  
ServletContext myContext = getServletContext();
myContext.setAttribute("MYSHAREDSESSIONID", sessionId);
myContext.setAttribute("SHAREDSESSION", session);

serv2(app2)

ServletContext callingContext = getServletContext().getContext("/app1");  
String jsessionId = (String)callingContext .getAttribute("MYSHAREDSESSIONID");

server.xml

<Host>
 <Context path="/app1" crossContext="true" />
 <Context path="/app2" crossContext="true" />
</Host>

问题是我在serv2 getAttribute()中得到空指针异常。根本原因是,getContext("/app1")正在返回 null 。上下文名称是正确的。我不知道为什么我无法检索servlet上下文。我不想使用cookie或URL重写。请帮忙。

2 个答案:

答案 0 :(得分:4)

到目前为止看起来很好。显然它被其他地方维护/生成的context.xml覆盖了。您可以在Tomcat的Context configuration reference中阅读有关规则的内容。例如,您是否在webapp的/META-INF中有一个?然后,您应该在那里定义crossContext

或者您是否使用像Eclipse这样的IDE来部署Web应用程序?然后,IDE必须配置为不部署到工作空间元数据中,而是直接部署到Tomcat中,否则Eclipse将使用自己的context.xml副本(您可以在 Servers 项目中找到它)。您可以在服务器的首选项中对其进行配置。这是Eclipse的一个屏幕:

enter image description here

答案 1 :(得分:0)

根据J2EE,每个上下文都有自己的会话管理。您不能跨两个不同的servlet上下文共享会话。您需要在上下文之间来回传递jessionid。