JavaサーブレットでPOSTデータからクエリ文字列パラメータを分離するにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/459441

質問

サーブレットでdoGetまたはdoPost呼び出しを取得する場合、getparameterxxx()を使用して、1つの簡単な場所でクエリ文字列または投稿データを取得できます。
呼び出しがGETであった場合、url / query文字列からデータを取得します。
呼び出しがPOSTの場合、投稿データがすべて解析されます。

フォームコールに「アクション」属性を設定しない場合、判明した場合を除きます。 アクションパラメーターに完全修飾または部分修飾のURLを指定すると、すべてがうまく機能します。指定しない場合、ブラウザーは、前のページの送信時と同じURLを呼び出し、クエリ文字列データがある場合、POSTデータと同様に取得します。それらを区別する方法はありません。

またはありますか? 私はリクエストオブジェクトを見て、投稿データがどこから来たのかを見て、GETデータがどこから来たかを把握しようとしているので、投稿呼び出しでGETデータを消去し、投稿データを消去できます可能であれば、解析する前のGET呼び出し。

これを行うための安全な方法は何ですか?

また、推測:フォームタグにアクションフィールドを配置しようとしたことはありません。 :-)

役に立ちましたか?

解決

HTMLでは、アクションは必須、そのため、動作はクライアントによって異なると思います。

他のヒント

そのとおりです。フォームタグにアクションフィールドを入れないようにしたことは決してありません;-)。 (また、有効なHTMLではないと思います)

<!> quot; clean <!> quot;がわからないGETパラメーターとPOSTパラメーターを区別する方法ですが、getQueryString()HttpServletRequestメソッドを使用して生のクエリ文字列にアクセスでき、getInputStream()ServletRequestメソッドを使用して生のPOSTデータにアクセスできます。 (ここではTomcat APIドキュメントを特に見ていますが、どちらも標準のサーブレットAPIの一部であると思いますが)必要に応じて、POSTデータとGETデータを別々に解析できます。それらは両方とも同じ方法でフォーマットされます(または通常はそうです)。つまり、

name1=value1&name2=value2&...

アンパサンドがセミコロンに置き換えられている可能性があります(技術的にはHTTP / 1.1で実行できますが、最近までそれを知りませんでした)

HttpServletRequest.getParameterxxx()メソッドは、GETパラメーターとPOSTパラメーターを区別しません。それらを本当に区別する必要がある場合は、GETパラメーターにgetQueryString()を使用し、POSTデータにgetInputStream()/ getReader()を使用して手動で解析する必要があります。

ServletFilterを作成し、リクエストオブジェクトをデコレートして、物事を少しクリーンアップします(上記のHiltonの提案を使用)。これは、インターセプトフィルターのクラシックデコレーターパターンです。

>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top