【问题标题】:communication between remote servlets远程 servlet 之间的通信
【发布时间】:2010-06-14 07:40:30
【问题描述】:

我有两个 Web 应用程序,分别是 App1 和 App2。我想从 App1 中的 servlet 调用 App2 中的 servlet。我为此使用 URLConnection。我还可以将参数传递给 App2 中的 servlet,并且还可以从 servlet 接收字符串形式的响应。但我想从 App2 中的 servlet 发送 java 对象并在 App1 的 servlet 中接收它们。如何做到这一点?

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    视情况而定。


    如果这些 web 应用程序在物理上运行在同一 servlet 容器中的同一 web 服务器上,则只需将其设置为请求属性并将请求转发到其他上下文:

    request.setAttribute("name", object);
    ServletContext app2 = getServletContext().getContext("app2");
    app2.getRequestDispacher("servletUrl").forward(request, response);
    

    其他上下文将能够获取对象如下:

    Object object = request.getAttribute("name");
    

    这只需要一个服务器设置,即上下文可以相互访问。如何做到这一点取决于 servletcontainer。以Tomcat为例,你只需要将webapp的<Context>元素的crossContext属性设置为true即可。

    <Context crossContext="true">
    

    然后它将可用于其他上下文。对于其他服务器,请查阅其文档。


    如果这些网络应用程序在物理上不同的网络服务器上运行,那么有几种选择:

    1. 转换为字符串并作为参数发送。在检索时,从 String 转换回来。 JSON 是一种很好的格式。 Google Gson 提供了在完全有价值的 Java 对象和 JSON 之间进行转换的可能性,反之亦然。如果您使用 GET 并且请求 URI 变得很长,超过 2KB,那么请考虑使用 POST 而不是 GET,否则 URI 可能会被服务器截断。优点:更好的可重用服务。缺点:难以发送二进制数据。

      另请参阅: Converting JSON to Java

    2. 根据RFC2388,使用URLConnectionApache HttpComponents Client 发送multipart/form-data HTTP POST 请求,并在另一端使用Apache Commons FileUpload 处理它。优点:标准规格,可以发送二进制数据。缺点:更多代码。

      另请参阅: How to use URLConnection

    3. Serialize Java 对象,使用ObjectOutputStream 将其原始写入URLConnection#getOutputStream(),并从HttpServletRequest#getInputStream() 中检索它,并使用ObjectInputStream 对其进行反序列化。优点:容易。缺点:不可重用,紧耦合。

      另请参阅: Object StreamsLesson: Serialization

    【讨论】:

      【解决方案2】:

      使用Serialization

      您将发送对象流,而不是发送 HTML。

      请注意,为了增加额外的安全性,您不希望某些外部源将中毒对象注入到您的调用中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 2012-03-17
        • 1970-01-01
        • 2016-03-29
        • 2015-07-15
        • 2020-07-15
        • 2020-05-19
        相关资源
        最近更新 更多