使Java servlet充当代理的代码?

我有两个Java Web应用程序,它们有一个servlet,它被映射到一个特定的URL:

red.war/ WEB-INF/classes com.me.myorg.red.RedServlet (maps to http://red.example.com/doStuff) blue.war/ WEB-INF/classes com.me.myorg.blue.BlueServlet (maps to http://blue.example.com/doStuff) 

我想把这些应用程序(我称之为“后端应用程序”)放在“代理应用程序”(servlet)后面,这将决定这两个应用程序中的哪一个最终将服务于客户端请求。

此代理Web应用程序将接收传入的HTTP请求,并确定将请求转发到的2个“后端应用程序”(红色或蓝色)中的哪一个。 然后,请求将转发到http://red.example.com/doStuff (然后由RedServlet#doGet(...) )或http://blue.example.com/doStuff (然后处理)通过BlueServlet#doGet(...) )。 然后,后端应用程序返回的响应(同样, RedServlet#doGet(...)BlueServlet#doGet(...) )将返回到代理Servlet,最终返回给客户端。

换句话说,在伪代码中:

 public class ProxyServlet extends HttpServlet { @Override public doGet(HttpServletRequest request, HttpServletResponse response) { String forwardingAddress; if(shouldBeRed(request)) forwardingAddress = "http://red.example.com/doStuff"; else forwardingAddress = "http://blue.example.com/doStuff"; PrintWriter writer = response.getWriter(); writer.write(getResponseFromBackend(forwardingAddress, request)); } private String getResponseFromBackend(String addr, HttpServletRequest req) { // Somehow forward req to addr and get HTML response... } } 

这可能吗? 如果是这样,我需要编写如何以及使用什么代码才能使其工作?

您可以使用RequestDispatcher以下列方式转发请求:

 RequestDispatcher dispatcher = httpRequest.getRequestDispatcher(forwardingAddress); // here you have the choice whether to use include(..) or forward(..) see below if(useInclude) dispatcher.include(httpRequest, httpResponse); else dispatcher.forward(httpRequest, httpResponse); 

…使用以下选项将useInlcude设置为您的选择:

  • 包括
    这可能是您想要做的:将来自forwardingAdress的内容加载到您的响应中。
    • 这意味着您甚至可以将多个目标包含在一个响应中。
    • 客户端甚至不会实现此过程,也不需要能够查看目标文档。
  • 向前
    发送转发到forwardingAddress 。 这将告诉客户端向指定的URL提交新请求
    • 如果您在带有开发人员工具的浏览器中执行此操作,您将看到第二个请求。
    • 客户端必须能够查看并加载目标URL。
    • 您只能转发到单个目标。

请参阅以下链接:

  • RequestDispatcher javadoc ,特别是对于注释:
    • 应在将响应提交给客户端之前调用forward (在刷新响应主体输出之前)。 如果响应已经提交,则此方法抛出IllegalStateException。 响应缓冲区中的未提交输出在转发之前自动清除。
    • include :请求和响应参数必须是传递给调用servlet的服务方法的相同对象,或者是包装它们的ServletRequestWrapper或ServletResponseWrapper类的子类。
  • URLRewriteFilter示例
    虽然这个例子是使用Filter而不是Servlet但行为是相同的(注意:这个例子是我的框架的一部分,因此在父类中包含一些开销。只需查看相关部分…… )

由于还没有批准的答案,我试着写一下我如何看到这个请求的解决方案使用apache-http-commons库。 另外我建议在作家上添加一个同花顺。

 public class ProxyServlet extends HttpServlet { @Override public doGet(HttpServletRequest request, HttpServletResponse response) { String forwardingAddress; if(shouldBeRed(request)) forwardingAddress = "http://red.example.com/doStuff"; else forwardingAddress = "http://blue.example.com/doStuff"; PrintWriter writer = response.getWriter(); writer.write(getResponseFromBackend(forwardingAddress, request)); **writer.flush();** } private String getResponseFromBackend(String addr, HttpServletRequest req) { HttpClient client = new HttpClient(); HttpMethod method = new GetMethod(url); client.executeMethod(method); String body=method.getResponseBodyAsString(); return body; } 

}