Как переслать requestdispatcher на удаленный URL
У меня HTML-страница http://www.mywebapp.com/sample.html
который используется с удаленного сервера. Я передаю HTML-URL как скрытую форму, как это в той же 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>
В моем сервлете я получил скрытый 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
,
Может кто-нибудь предложить мне идею, чтобы решить эту проблему.
РЕДАКТИРОВАНИЕ
То, что я точно хочу сделать, это то, что с удаленного сервера HTML-страница будет запрашивать мои веб-службы REST. Ответ веб-службы будет в выводе JSON. Теперь я хочу отправить этот ответ JSON в запрошенную HTML-форму (т.е. на HTML-страницу удаленного сервера)
Может кто-нибудь предложить идею, чтобы решить эту проблему. Ваша помощь будет оценена.
3 ответа
Вы не можете переслать запрос на URL, который является внешним по отношению к вашему веб-приложению. Вы, вероятно, хотите отправить перенаправление на этот URL. Увидеть HttpServletResponse.sendRedirect()
,
Если вам абсолютно необходимо переслать запрос, а не перенаправить (например, если удаленный URL-адрес доступен только серверу, а не пользователю), вы можете выполнить переадресацию самостоятельно. В вашем сервлете вы можете сделать запрос к удаленному URL и записать InputStream из этого запроса в 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();
Это, очевидно, не обрабатывает многокомпонентный запрос в вашем примере, но дает вам общее представление о том, как достичь того, чего вы хотите. Я бы порекомендовал использовать HTTP-компоненты Apache для выполнения запроса вместо HttpURLConnection, поскольку это облегчит выполнение многокомпонентного запроса с файлом (я думаю, вам придется вручную создавать тело multipart/form-data с помощью HttpURLConnection), Пример создания запроса можно найти в разделе Как сделать POST-запрос multipart/form-data с использованием Java?, InputStream может быть получен из HttpEntity путем вызова getContent() (который будет эквивалентен conn.getInputStream() в примере).
Записать InputStream в OutputStream также проще с помощью метода Apache Commons IO IOUtils.copy().
РЕДАКТИРОВАТЬ: Может быть возможно использовать req.getInputStream(), чтобы получить необработанное тело запроса и записать его в paramsWriter.writeBytes(), но я не пробовал это, так что нет гарантии, что это будет работать. Я не уверен, что именно req.getInputStream() содержит для запроса на публикацию.
Вы не можете переслать на другой сервер.
Вы можете использовать resp.sendRedirect(url)
http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html
вместо этого метод, который будет возвращать перенаправление 302 на указанный URL.