java - RequestDispatcher 是否可以在一个 servlet 容器中的多个 Web 应用程序上工作?

标签 java tomcat servlets requestdispatcher

RequestDispatcher 是否可以在多个 Web 应用程序上工作?

我这么问是因为我有一个 Web 应用程序工作正常,它使用 RequestDispatcher 而不是重定向,因此在显示错误和反馈消息时状态不会丢失。

但是,我现在需要在两个 Web 应用程序之间拆分一些功能,因此初始调用是从 webapp1 上托管的网页进行的,调用 webapp2,最终将用户返回到 webapp1 上托管的页面。

显然,如果 webapps 和 webapp2 位于不同的网站上,则使用 RequestDispatcher 是不可能的,但如果两个 webapps 都部署在 servlet 容器的同一个实例中(tomcat 7),则可能会出现这种情况

更新

让请求调度程序部分按照答案中的说明工作,但无法检索放入我的 webapp2 中的数据,这就是我使用它的原因

webapp2 调用,进行一些处理,然后分派(dispatch)到 webapp1 上的 jsp

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
{

    HttpSession userSession = request.getSession(true);
    String emailAddress = ......
    String nextPage     = /finish.jsp
    userSession.setAttribute("DATA", emailAddress);
    ServletContext otherContext = getServletContext().getContext("/webapp1");
    otherContext.getRequestDispatcher(nextPage).forward(request, response); 
}

webapp2 jsp 文件包含

...
<p>Email(<%=((String)session.getAttribute("DATA"))%>)</p>
...

但总是显示 null

更新 2 **

我想知道我是否误解了 crossContext="true"的实际作用。它是否使相同的 HttpSession 在不同的 web 应用程序中可用,或者只是使 ServletContext 从一个 webapp 到另一个 web 应用程序可用,从而允许一个 web 应用程序查看另一个 web 应用程序的 HttpSession ?

我开始认为我所做的事情是一个坏主意,因为我一直热衷于使用普通的 servlet 设置,并且不想将自己束缚在特定的实现上。我认为如果我解释一下为什么我首先不需要拆分网络应用程序,这可能会有所帮助。

我有一个 Web 应用 (webapp1),这是一个关于我开发的产品的网站,并编写了使用 Google Checkout(现在的 Google 电子钱包)购买该产品的代码。

然后,我添加了为新产品 (webapp2) 创建的新 Web 应用程序。

然后,我尝试将新产品的 Google Checkout 添加到 webapp2 中,但意识到我无法轻松做到这一点,因为 Google Checkout 要求我向它提供一个网址,一旦处理完付款,应用程序就可以调用该网址,以便我可以发送 用户许可证。 url 已设置为 webapp1 中的 servlet,但是 webapp1 处理产品 2 的付款是没有意义的。

一种选择是将 webpp1 和 webapp2 合并到一个 webapp 中,但这违背了我保持模块化的一般观点,它 也意味着每次我都想为一个人做出改变 产品 ID 必须重新部署所有内容。这也意味着大 对 webapp1 的修改,我真的不想修改它 工作正常且稳定。

另一种方法是创建 webapp3,然后 google url 可以指向它,并使用它来处理产品 1 的购买 和产品2,这就是我所做的。但问题是当 购买产品 1 起始页面位于 webapp1 中,并且一次 购买已发生 我想返回 webapp1 中的页面,但是 只有 webapp3 具有刚刚创建的用户的详细信息 购买我想在 webapp1 的页面上显示的内容。

最佳答案

由于安全原因,默认情况下这是不可能的。您首先需要配置 Tomcat 以将当前 Web 应用程序的 ServletContext 公开给其他 Web 应用程序。这可以通过设置the crossContext attribute of context.xml来完成。为true

<Context ... crossContext="true">

完成后,您可以使用ServletContext#getContext()通过上下文路径获取其他 Servlet 上下文,最后使用 ServletContext#getRequestDispatcher() 获取的 RequestDispatcher就像您对通过 HttpServletRequest#getRequestDispatcher() 获取的方法所做的通常方式一样。

例如

ServletContext otherContext = getServletContext().getContext("/otherContext");
otherContext.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);

关于java - RequestDispatcher 是否可以在一个 servlet 容器中的多个 Web 应用程序上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435678/

相关文章:

java - 使用切面劫持不同 servlet 中类的静态方法

java - 通过part.write将带有httpservlet的文件上传到java.io.tmpdir - 到绝对tmp路径

java - 带有 Urlconnection 获取请求的 FileNotFoundException

java - 我是否需要为 Spring Data 中的可审计字段提供 getter/setter?

tomcat - 当我构建应用程序以对抗 SLO(单点注销)时停止工作

java - ClassNotFoundException 异常

java - 使用 1 个 SocketChannel 进行 2 路 "real-time communictation"

java - 使用字符数组代替字符串

jsp - 将变量写入 JSP 请求范围不起作用

java - 基于 HttpServletRequest 生成全局(应用程序范围)唯一请求 id 的算法?