如何将requestdispatcher转发到远程URL

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

 

在我的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); 

我收到ERROR 404

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

EDITED

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

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

您无法将请求转发到您的网络应用外部的url。 您可能希望将重定向发送到此URL。 请参阅HttpServletResponse.sendRedirect()

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

如果您绝对需要转发请求而不是重定向(例如,如果远程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来执行请求,因为它会使文件的多部分请求更容易实现(我想你必须使用HttpURLConnection手动创建multipart / form-data体) 。 可以在如何使用Java创建multipart / form-data POST请求中找到发出请求的示例? 。 可以通过调用getContent()(在示例中等效于conn.getInputStream())从HttpEntity获取InputStream。

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

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

你不能转发到另一台服务器。

你可以使用resp.sendRedirect(url)

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

相反,它将302重定向返回到指定的URL。