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可能对此非常有帮助。
正如其他人所指出的,你想要的是代理。 你的选择:
-
找一个执行此操作的开源Java库。 有几个,但我没有使用它们,所以我不推荐任何。
-
自己写吧。 不应该太难,只记得处理传递所有标题和响应代码之类的东西。
-
在Apache 2.2中使用代理模块。 这是我选择的那个,因为我已经知道它可靠地工作了。
Jetty有一个示例ProxyServlet实现,它使用了URL.openConnection() 。 随意使用或作为您自己实现的灵感。 😉
或者您可以使用Apache HttpClient ,请参阅教程 。
- 如何使用yuicompressor-maven-plugin让maven与缩小的文件建立战争
- Spring,MySQL和Hibernate:如果系统在8小时内未使用,则会出现数据库错误
- Selenium sendKeys()针对Chrome,Firefox和Safari的不同行为
- 帮助ant文件 – Java任务的类路径
- java中的curl命令
- 无法自动配置DataSource:未指定“spring.datasource.url”
- 将DefaultCategoryDataset强制转换为CategoryDataset
- 调用entityManager.getTransaction()时的EJBException
- JUnit4使用testsuite在特定包中运行所有测试