3

(まだ)ファイルをアップロードせずに、サーブレットフィルターでHTTPマルチパートリクエストのフォームパラメーターを取得する方法を探しています。

request.getParameterMap()は空を返します。これは、リクエストがマルチパートであるためだと理解しています。

commons.HttpFileUploadを見てきましたが、これは私の状況ではやり過ぎのようです。このフィルターでは、通常のパラメーターのみに関心があり、ファイルのアップロードはまだ処理したくありません。

編集:主な問題は、フィルタースタックのさらに下に完全なHttpRequestObjectが必要なことです。HttpFileUploadは、要求データの一部を消費しているようです(おそらく、データストリームオブジェクトを使用して再度閉じます)。

4

4 に答える 4

6

これは確かにやり過ぎではありません。正しい方法であり、自分でパーサーを作成するよりも常に優れています。Apache Commons FileUploadは、何年にもわたって開発および維持されており、マルチパート/フォームデータ要求の処理における堅牢性が証明されています。車輪の再発明はしたくありません。本当にやりたいのであれば (私はお勧めしません)、multipart/form-data の仕様を読み、HttpServletRequest#getInputStream()(警告: これはバイナリ データと文字データが混在しています!) を読むことから始めてください。

必要に応じて、内部で Apache Commons FileUpload を利用し、すべてのリクエストが multipart/form-data であるかどうかをチェックする Filter を作成し、そうであれば、Commons FileUpload を使用してパラメーターをリクエスト パラメーター マップに戻すこともできます。アップロードされたファイル (または例外) をリクエスト属性として配置して、最終的にサーブレット コードでもう少し透過的にします。アイデアを得るための基本的な例をここで見つけることができます。

お役に立てれば。

于 2009-11-17T11:45:41.560 に答える
5

すでに提供されている回答に追加するだけです-既存のWebアプリにCSRF検証を追加しようとしていたという点で、非常によく似た問題がありました。いくつかの JS を使用して各フォームに特別なトークンを含め、トークンが存在することを確認するサーブレット フィルターを追加することにしました (したがって、一般的な分離されたソリューションです)。

サーブレットは、トークンが存在するかどうかをチェックしますが、ファイル アップロード オプションを提供するすべてのフォームで壊れていました。したがって、グーグルをしているときに、このページに頻繁にアクセスしました。

私たちが使用した回避策 (アップロードされたファイルの処理を回避しようとしている間) は、JavaScript を取得してトークンを GET パラメーターとして追加することでした。つまり、フォームのアクション URL を変更してトークンを含め、HttpServletRequest.getParameter を使用できるようにしました。 () トークン (およびトークンのみ) のメソッド。

これを IE、FF、Chrome でテストしましたが、すべて問題ないようです。

これが、同様の状況に陥っている人の助けになることを願っています。

于 2011-10-14T14:09:12.597 に答える
4

Oreilly ServletsのWeb サイトには、ダウンロードしてカスタマイズして使用できるサンプル コードがいくつかあります。これには、必要なことを行うように聞こえるMultipartRequestが含まれます。マルチパートリクエストをアンボックスし、パラメーターとファイルに個別にアクセスできるようにします。

于 2009-11-17T11:50:31.227 に答える