6

http://www.mywebapp.com/sample.htmlリモートサーバーから使用されるHTML ページがあります。同じ HTML フォームでこのように HTML 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>

私のサーブレットでは、隠しURLhttp://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 Web サービスに要求することです。Web サービスの応答は JSON 出力になります。ここで、この JSON 応答を要求された HTML フォーム (つまり、リモート サーバーの HTML ページ) に送信したいと考えています。

誰でもこれを解決するためのアイデアを提案できますか? あなたの助けに感謝します。

4

3 に答える 3

9

Web アプリケーションの外部にある URL にリクエストを転送することはできません。代わりに、この URL にリダイレクトを送信することをお勧めします。を参照してくださいHttpServletResponse.sendRedirect()

JSP フォワードとリダイレクトの違いを参照してください。

于 2013-01-22T13:26:21.893 に答える
7

リダイレクトではなくリクエストを絶対に転送する必要がある場合 (たとえば、リモート 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();

これは明らかにあなたの例のマルチパートリクエストを処理しませんが、あなたが望むものを達成する方法についての基本的なアイデアを提供します. HttpURLConnection の代わりに Apache HTTP Components を使用してリクエストを実行することをお勧めします。これにより、ファイルを使用したマルチパート リクエストを簡単に実現できるためです (HttpURLConnection を使用してマルチパート/フォーム データ ボディを手動で作成する必要があると思います)。 . リクエストの作成例は、How can I make a multipart/form-data POST request using Java? にあります。. InputStream は、getContent() を呼び出すことによって HttpEntity から取得できます (これは、例の conn.getInputStream() と同等です)。

InputStream を OutputStream に書き込むことも、Apache Commons IO IOUtils.copy() メソッドを使用してより簡単に実現できます。

編集: req.getInputStream() を使用して生のリクエスト本文を取得し、それを paramsWriter.writeBytes() に書き込むことは可能かもしれませんが、私はこれを試していないため、動作する保証はありません。投稿リクエストの req.getInputStream() に何が含まれているか正確にはわかりません。

于 2016-03-11T21:33:28.850 に答える
2

別のサーバーに転送することはできません。

を使用できます。resp.sendRedirect(url)

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

代わりに、指定された URL への 302 リダイレクトを返すメソッド。

于 2013-01-22T13:25:04.020 に答える