我在一个运行在同一容器(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重写。请帮忙。
答案 0 :(得分:4)
到目前为止看起来很好。显然它被其他地方维护/生成的context.xml
覆盖了。您可以在Tomcat的Context
configuration reference中阅读有关规则的内容。例如,您是否在webapp的/META-INF
中有一个?然后,您应该在那里定义crossContext
。
或者您是否使用像Eclipse这样的IDE来部署Web应用程序?然后,IDE必须配置为不部署到工作空间元数据中,而是直接部署到Tomcat中,否则Eclipse将使用自己的context.xml
副本(您可以在 Servers 项目中找到它)。您可以在服务器的首选项中对其进行配置。这是Eclipse的一个屏幕:
答案 1 :(得分:0)
根据J2EE,每个上下文都有自己的会话管理。您不能跨两个不同的servlet上下文共享会话。您需要在上下文之间来回传递jessionid。