RequestDispatcher用于远程服务器?

我正在尝试创建一个HttpServlet,它将所有传入的请求按原样转发给另一个在不同域上运行的serlvet。

如何实现这一目标? RequestDispatcher的forward()仅在同一服务器上运行。

编辑:我不能介绍任何依赖项。

当它不在相同的ServletContext或相同的/ clustered webserver中运行时,你不能在webapps配置为共享ServletContext的情况下运行(在Tomcat的情况下,检查crossContext选项)。

必须通过HttpServletResponse.sendRedirect()发送重定向。 如果您真正担心的是重新使用新URL上的查询参数,只需重新发送它们即可。

 response.sendRedirect(newURL + "?" + request.getQueryString()); 

或者当它是POST时,发送HTTP 307重定向,客户端将在新URL上重新应用相同的POST查询参数。

 response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT); response.setHeader("Location", newURL); 

根据评论更新 ,这显然不是一个选项,因为你想要隐藏URL。 在这种情况下,您必须让servlet播放代理。 您可以使用HTTP客户端执行此操作,例如Java SE提供的java.net.URLConnection ( 此处为迷你教程 )或更方便的Apache Commons HttpClient 。

如果它是GET,那就做:

 InputStream input = new URL(newURL + "?" + request.getQueryString()).openStream(); OutputStream output = response.getOutputStream(); // Copy. 

或者如果是POST:

 URLConnection connection = new URL(newURL).openConnection(); connection.setDoOutput(true); // Set and/or copy request headers here based on current request? InputStream input1 = request.getInputStream(); OutputStream output1 = connection.getOutputStream(); // Copy. InputStream input2 = connection.getInputStream(); OutputStream output2 = response.getOutputStream(); // Copy. 

请注意,您可能需要捕获/替换/更新HTML响应中的相对链接(如果有)。 Jsoup可能对此非常有帮助。

正如其他人所指出的,你想要的是代理。 你的选择:

  1. 找一个执行此操作的开源Java库。 有几个,但我没有使用它们,所以我不推荐任何。

  2. 自己写吧。 不应该太难,只记得处理传递所有标题和响应代码之类的东西。

  3. 在Apache 2.2中使用代理模块。 这是我选择的那个,因为我已经知道它可靠地工作了。

Jetty有一个示例ProxyServlet实现,它使用了URL.openConnection() 。 随意使用或作为您自己实现的灵感。 😉

或者您可以使用Apache HttpClient ,请参阅教程 。