2016-06-23 7 views
0

私はいくつかの奇妙な質問があります: POST経由でhtmlフォームを送信すると、私たちのすべてのパラメータはGET submitの場合、リクエストボディに送られます:paramsはURLのqueryStringに行きます。TwitterのHTTP要求解析ロジックを書き直す

しかし、bodyのparamsとURLのqueryStringを使ってPOSTを送信するなど、私たちは停止できません。ここに問題があります。Tomcatの解析リクエストとorg.apache.coyote.Requestオブジェクトの作成 - queryStringとbodyのすべてのパラメータがParameterMapに移動し、パラメータがどこから来たのか検出できません。私はそれからqueryStringとparse paramsを得ることができますが、私は体内のこのparamであるかどうかを検出できません。

例:

1)

<form method="POST" action="someUrl/?a=1&a=2"> 
    <input type="hidden" name="a" value="1"/> 
    <input type="hidden" name="a" value="2"/> 
... 
</form> 

パラメータマップは、それらから来る任意の情報なしに二つの値1,2を有するであろう。それらは体内で、またはなかった

2)

<form method="POST" action="someUrl/?a=1&a=2"> 
... 
</form> 

パラメータマップは、任意の情報なしに二つの値1,2を有するであろう。

tomcatのリクエスト解析ロジック、折り返しリクエストなどを書き換える必要がありますか?もし必要なら - マニュアルが必要だと思う。任意のアイデア、推測。ありがとうございました。

+0

あなたがやっていることは、有効なHTTPではありません。標準的なソフトウェアが非標準的なプラクティスをサポートすると期待するのは妥当ではありません。 – EJP

+0

私はこれを知っていませんが、この要件を満たしており、回避策が必要です。だから私は尋ねている - 私はどのように風袋をカスタマイズすることができますか?出来ますか? –

+0

要件を変更する必要があります。 URLには要求パラメータと要求本体との間にHTTPの区別はありません。 – EJP

答えて

1

Tomcatでは、クエリ文字列またはリクエスト本文のいずれかからパラメータが来る可能性があるため、両方で検索する必要がないように、マージします。

しかし、実際にパラメータの非標準的な使用を許可したい場合は、request.getQueryString()を使用してクエリ文字列を取得して(要求文字列パラメータを解析するために)取得できます。

そして、リクエスト本体をrequest.getReader()で別々に読んでから、それを解析して本文のパラメータで見つけることができます。

ParameterMapの使用は、標準的な使用の助けになりますが、実際に使用する必要はありません。

+0

ニース。 Lemmeこれを試してみてください。 –

+0

Tomcatは私の前に読者を読んでいます。読者が空になったら、回避策はありますか? –

+0

@AleksanderMelnichnikov:Tomcat **はあなたのためにそのリーダーを設定します。それはサーブレットコンテナであり、 'HttpServletRequest'の実装はTomcatからのものなので、サーブレット仕様を尊重すると仮定します。 –

関連する問題