3

次のコードを使用して、httpclient-4を使用してストリームのコンテンツ(この場合は巨大なファイル)をTomcatのアップロードサーブレットに送信しています。

HttpRequest httpRequest = new HttpPut(destination);
InputStreamEntity entity = new InputStreamEntity(inputStream, contentLength);
((HttpPut)httpRequest).setEntity(entity);
httpClient.execute(httpRequest,handler);

それはうまくいきました。後で、許可されていないユーザーがファイルをアップロードするのを防ぐための認証メカニズムを追加しました。誰かが認証されずにアップロードしようとすると、サーブレットは直接応答します

response.sendError(HttpServletResponse.SC_FORBIDDEN)

リクエストのInputStreamを処理することさえありません。

私が直面している問題は、サーバー側で要求が拒否されたにもかかわらず、クライアントがInputStreamのコンテンツ全体を送信し続け、ネットワークの使用がまったく役に立たないことです。

httpclientのドキュメントを調べましたが、残念ながらこの点については何も見つかりませんでした。また、Tomcat側を調べて、リクエストを中止できるかどうかを確認しましたが、可能ではないようです

この状況でストリームのアップロードをキャンセルする方法はありますか?

任意の洞察をいただければ幸いです。

ありがとう

4

2 に答える 2

3

この問題の適切な解決策は、いわゆる「expect: continue」ハンドシェイクをクライアント側でオンにすることです。Apache HttpClient 4.x の新しいリリースでは、デフォルトで無効になっています。

于 2012-08-24T15:48:16.860 に答える
1

サーバー側で InputStream を閉じると、転送が停止します。

于 2012-08-24T09:43:16.677 に答える