Как переслать 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(),

См. Разницу между JSP forward и redirect

Если вам абсолютно необходимо переслать запрос, а не перенаправить (например, если удаленный 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.

Другие вопросы по тегам