如何将的RequestDispatcher转发到远程URL(How to forward the r

2019-07-18 13:08发布

我有一个HTML页面http://www.mywebapp.com/sample.html这是从远程服务器使用。 我经过HTML网址为隐藏的表单如在相同的HTML表单,

<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和页面转发到隐藏URL这样,

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

我得到ERROR 404

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

EDITED

我究竟想要做的是,从远程服务器HTML页面会要求我的REST Web服务。 Web服务的响应将是JSON输出。 现在,我想给这个JSON响应请求的HTML形式(即到远程服务器上的HTML页面)

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

Answer 1:

您不能转发到外部到你的web应用的URL的请求。 你可能想重定向发送到这个网址来代替。 见HttpServletResponse.sendRedirect()

见JSP的区别向前和重定向



Answer 2:

如果您确实需要将请求转发,而不是重定向(例如,如果远程URL仅仅是服务器,而不是用户访问),可以做自己的转发。 在你的servlet,可以使远程URL的请求,写从请求到的OutputStream在servlet InputStream的。 你会明显地要寻找和处理与请求的任何错误,确保数据流的正确关闭,虽然。 您还需要手动向前从请求到新的参数。

其基本做法是:

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的手动创建的multipart / form-data的体) 。 提出请求的例子,可以发现如何让使用Java的multipart / form-data的POST请求? 。 的InputStream可以从HttpEntity通过调用的getContent()获得(这将是本例中的相当于conn.getInputStream())。

编写的InputStream OutputStream的,也可以使用Apache共享IO IOUtils.copy()方法更容易实现。

编辑:它可能会使用req.getInputStream()来获取原始请求主体和写入到paramsWriter.writeBytes(),但我没试过这样也不能保证它会工作。 我不知道到底是什么req.getInputStream()包含一个POST请求。



Answer 3:

你不能期待一个不同的服务器。

您可以使用resp.sendRedirect(url)

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

方法来代替该方法将返回302重定向到指定的URL。



文章来源: How to forward the requestdispatcher to a remote URL