远程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服务器上运行,那么有几个选项:
-
转换为String并作为参数发送。 在检索时,从String转换回来。 JSON是一个很好的格式。 Google Gson提供了在完全可用的Java对象和JSON之间进行转换的可能性,反之亦然。 如果你正在使用GET并且请求URI变得非常长,超过2KB,那么考虑使用POST而不是GET,否则URI可能会被服务器截断。 优点:更好的可重复使用服务。 缺点:很难发送二进制数据。
另请参阅: 将JSON转换为Java 。
-
根据RFC2388使用
URLConnection
或Apache HttpComponents Client发送multipart/form-data
HTTP POST请求,并使用Apache Commons FileUpload在另一端处理它。 优点:标准规范,可以发送二进制数据。 缺点:更多代码。另请参见: 如何使用URLConnection 。
-
序列化 Java对象,使用
ObjectOutputStream
将其原始写入URLConnection#getOutputStream()
并从HttpServletRequest#getInputStream()
检索它并使用ObjectInputStream
对其进行反序列化。 优点:简单。 缺点:不可重复使用,紧耦合。另请参见: 对象流和课程:序列化 。
使用序列化
您将发送对象流,而不是发送HTML。
只是,请注意,要添加额外的安全性,您不希望某些外部源将有毒对象注入您的调用。