2013-01-22 148 views
4

上面有一个从远程服务器使用的HTML页面http://www.mywebapp.com/sample.html。我经过HTML网址为隐藏的表单如在相同的HTML表单,如何将requestdispatcher转发到远程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和转发页面到这样的隐藏URL,

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

am getting ERROR 404

任何人都可以提出一个想法来解决这个问题。

EDITED

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

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

+1

http://stackoverflow.com/a/3916286/3767784 – FaNaJ

+0

尽管@fanaj链接不包含描述 - 我强烈建议检查它,因为它描述了如何使用307重定向,以便“客户端将重新应用新网址上的相同POST查询参数“其他重定向不执行此操作。我正在研究同样的问题 – JGlass

回答

2

你不能转发到不同的服务器。

可以使用resp.sendRedirect(url)

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

方法,而不是将返回302重定向到指定的URL。

+0

是的,我可以理解,它升高了302,这就是为什么尝试一种替代方法。你可以建议我如何响应远程服务器这是一个HTML页面。我的回复包含JSON输出 – sathya

+0

嗨,对不起,我不完全清楚你正在尝试做什么 – cowls

+0

远程HTML表单正在向我的REST Web服务发送数据。我将响应作为JSON输出发送到请求的远程HTML表单。这正是我希望你得到的。现在我的问题是我想发送JSON输出到请求的远程HTML表单 – sathya

9

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

Difference between JSP forward and redirect

+0

如果我使用'HttpServletResponse.sendRedirect()'得到302状态码,不应该发生。你可以建议我如何响应远程服务器这是一个HTML页面。我的回应包含JSON输出 – sathya

+0

*如何响应远程服务器这是一个HTML页面*:我不明白这意味着什么。你想达到什么目的? –

+0

远程HTML表单正在向我的REST Web服务发送数据。我将响应作为JSON输出发送到请求的远程HTML表单。这正是我希望你得到的。现在我的问题是我想发送JSON输出到所请求的远程HTML表单 – sathya

3

如果您确实需要将请求转发,而不是重定向(例如,如果远程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手动创建multipart/form-data主体) 。提出请求的一个例子可以在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()包含的是什么。

相关问题