java - 远程服务器的 RequestDispatcher?

标签 java servlets

我正在尝试创建一个 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/

相关文章:

java - 在 session 中保存数据库值

java - Runnable Jar -> 命令行参数的帮助函数

java - 我的 Java 应用程序中的离线奖励系统

用于登录的身份验证过滤器和 servlet

javascript - 在 HTML 中嵌入 PDF 字节数据

java - java servlet 中出现令人惊讶的结果

java - 使用 JMX 监视在 Tomcat 中运行的 J2EE 应用程序

java - 在 Spring 中混合 web.xml 和 AbstractAnnotationConfigDispatcherServletInitializer

java - 为什么更改类型会导致成​​员的不同用法?

java - 正则表达式:非法的十六进制转义序列