远程servlet之间的通信

我有两个Web应用程序说App1和App2。 我想从App1中的servlet调用App2中的servlet。 我正在使用URLConnection。 我也能够将参数传递给App2中的servlet,我也能够从servlet接收响应作为字符串。 但我想从App2中的servlet发送java对象,并在App1的servlet中接收它们。 怎么做到这一点?

依靠。


如果这些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中,您只需crossContext webapp的元素的crossContext属性设置为true

  

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


如果这些Web应用程序在物理上不同的Web服务器上运行,那么有几个选项:

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

    另请参阅: 将JSON转换为Java 。

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

    另请参见: 如何使用URLConnection 。

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

    另请参见: 对象流和课程:序列化 。

使用序列化

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

只是,请注意,要添加额外的安全性,您不希望某些外部源将有毒对象注入您的调用。