我有一个从远程服务器使用的HTML页面http://www.mywebapp.com/sample.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中,我得到了隐藏的URL http://www.mywebapp.com/sample.html
并将其存储为
String fieldValue = http://www.mywebapp.com/sample.html
现在当我尝试RequestDispatcher
并将页面转发到这样的隐藏网址时,
RequestDispatcher rd = req.getRequestDispatcher(fieldValue);
rd.forward(req, resp);
我得到了ERROR 404
。
任何人都可以建议我解决这个问题。
EDITED
我真正想做的是,从远程服务器,HTML页面将请求我的REST Web服务。 Web服务的响应将以JSON输出。现在我想将此JSON响应发送到请求的HTML表单(即远程服务器HTML页面)
任何人都可以提出解决这个问题的想法。 我们将非常感谢您的帮助。
答案 0 :(得分:9)
您无法将请求转发到您的网络应用外部的网址。您可能希望将重定向发送到此URL。请参阅HttpServletResponse.sendRedirect()
。
答案 1 :(得分:5)
如果您绝对需要转发请求而不是重定向(例如,如果远程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 Components来代替HttpURLConnection来执行请求,因为它会使文件的多部分请求更容易实现(我想你必须手动创建multipart / form -data body with HttpURLConnection)。可以在How can I make a multipart/form-data POST request using Java?找到发出请求的示例。可以通过调用getContent()(在示例中等效于conn.getInputStream())从HttpEntity获取InputStream。
使用Apache Commons IO IOUtils.copy()方法也可以更轻松地将InputStream写入OutputStream。
编辑: 可以使用req.getInputStream()来获取原始请求体并将其写入paramsWriter.writeBytes(),但我没有尝试过这样,所以不能保证它会起作用。我不确定req.getInputStream()包含哪个帖子请求。
答案 2 :(得分:2)
您无法转发到其他服务器。
您可以使用resp.sendRedirect(url)
方法,它将302重定向返回到指定的URL。