6

http://www.mywebapp.com/sample.html我有一个从远程服务器使用的 HTML 页面。我在同一个 HTML 表单中将 HTML URL 作为隐藏表单传递,

<form action="/myservlet?userid=12345" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Submit">
<input type="hidden" name="url" value="http://www.mywebapp.com/sample.html"/>
</form>

在我的 servlet 中,我得到了隐藏的 URLhttp://www.mywebapp.com/sample.html并将其存储为 String fieldValue = http://www.mywebapp.com/sample.html

现在,当我尝试RequestDispatcher将页面转发到这样的隐藏 URL 时,

RequestDispatcher rd = req.getRequestDispatcher(fieldValue);
rd.forward(req, resp);

我得到了ERROR 404

谁能给我一个解决这个问题的想法。

已编辑

我真正想做的是,从远程服务器一个 HTML 页面将请求我的 REST Web 服务。Web 服务的响应将在 JSON 输出中。现在我想将此 JSON 响应发送到请求的 HTML 表单(即远程服务器 HTML 页面)

任何人都可以提出一个解决这个问题的想法。您的帮助将不胜感激。

4

3 回答 3

9

您不能将请求转发到 Web 应用程序外部的 URL。您可能想改为发送到此 URL 的重定向。见HttpServletResponse.sendRedirect()

请参阅JSP 转发和重定向之间的区别

于 2013-01-22T13:26:21.893 回答
7

如果您绝对需要转发请求而不是重定向(例如,如果远程 URL 只能由服务器访问而用户不能访问),则可以进行自己的转发。在您的 servlet 中,您可以向远程 URL 发出请求,并将该请求中的 InputStream 写入您的 servlet 中的 OutputStream。不过,您显然希望查找并处理请求中的任何错误,并确保正确关闭流。您还需要手动将请求中的任何参数转发到新参数。

基本方法是:

URL url = new URL("http://www.externalsite.com/sample.html");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);

String postParams = "foo="+req.getParameter("foo");

DataOutputStream paramsWriter = new DataOutputStream(con.getOutputStream());
paramsWriter.writeBytes(postParams);
paramsWriter.flush();
paramsWriter.close();

InputStream remoteResponse = conn.getInputStream();
OutputStream localResponder = resp.getOutputStream();
int c;
while((c = remoteResponse.read()) != -1)
    localResponder.write(c);
remoteResponse.close();
localResponder.close();

conn.disconnect();

这显然不处理您的示例中的多部分请求,但它为您提供了有关如何实现所需内容的基本概念。我建议使用 Apache HTTP 组件而不是 HttpURLConnection 来执行请求,因为它会使带有文件的多部分请求更容易实现(我想您必须使用 HttpURLConnection 手动创建多部分/表单数据主体) . 可以在How can I make a multipart/form-data POST request using Java? . InputStream 可以通过调用 getContent() 从 HttpEntity 获得(这将等效于示例中的 conn.getInputStream() )。

使用 Apache Commons IO IOUtils.copy() 方法也可以更轻松地将 InputStream 写入 OutputStream。

编辑:可以使用 req.getInputStream() 获取原始请求正文并将其写入 paramsWriter.writeBytes() 但我没有尝试过,所以不能保证它会起作用。我不确定 req.getInputStream() 包含的 post 请求到底是什么。

于 2016-03-11T21:33:28.850 回答
2

您无法转发到其他服务器。

您可以使用resp.sendRedirect(url)

http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html#sendRedirect%28java.lang.String%29

方法将返回一个 302 重定向到指定的 URL。

于 2013-01-22T13:25:04.020 回答