如何将requestdispatcher转发到远程URL

sat*_*hya 4 java rest web-services servlets requestdispatcher

我有一个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>
Run Code Online (Sandbox Code Playgroud)

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

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

RequestDispatcher rd = req.getRequestDispatcher(fieldValue);
rd.forward(req, resp);
Run Code Online (Sandbox Code Playgroud)

我明白了ERROR 404.

任何人都可以建议我解决这个问题.

EDITED

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

任何人都可以提出解决这个问题的想法.我们将不胜感激.

JB *_*zet 9

您无法将请求转发到您的webapp外部的URL.您可能希望将重定向发送到此URL.见HttpServletResponse.sendRedirect().

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


Jon*_*han 6

如果您绝对需要转发请求而不是重定向(例如,如果只能由服务器而非用户访问远程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();
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:有可能使用req.getInputStream()来获取原始请求主体并将其写入paramsWriter.writeBytes(),但我没有尝试过,因此无法保证它会起作用。我不确定确切的要求req.getInputStream()。


cow*_*wls 2

您无法转发到不同的服务器。

您可以使用resp.sendRedirect(url)

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

方法,它将返回 302 重定向到指定的 URL。