我正在尝试创建一个 HttpServlet,它将所有传入请求按原样转发到在不同域上运行的另一个 serlvet。
如何做到这一点? RequestDispatcher 的 forward() 仅在同一服务器上运行。
编辑:我不能引入任何依赖项。
最佳答案
当它不在相同的 ServletContext
或相同/集群的网络服务器中运行时,你不能在其中 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
( mini tutorial here ) 或更方便的 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 - 远程服务器的 RequestDispatcher?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3916214/