request.getParameterNames()でIllegalArgumentException
2015年10月08日 21時52分09秒
JAVA:1.8.0
アプリケーションサーバ:Wildfly 8.1.0
リクエストが届いたら、ログにパラメータを出力するようにしています。
いちいちパラメータ名をハードコーディングしてgetParameterするわけにもいかないので、
getParameterNamesを使って、要素分getParameterしてログに出力しています。
しかし、あるリクエストが来た際、getParameterNamesでエラーが発生!!
エラーの詳細は
java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string:
原因を調べてみると、
パラメータ名にURLデコード出来ない文字、例えば%ssという文字が含まれた状態でリクエストが飛んできているのが原因でした。
getParameterNamesを実行すると、内部でURLDecoderのdecodeメソッドを実行している為、
decodeメソッドで、そんなのデコード出来ない!!と怒っているようです。
まぁこの問題自体は別にどうでもいいんですが、
問題は、URLデコード出来ない文字がパラメータに含まれていると、getParameterNamesまたはgetParameterが出来ず、
パラメータがログに出力出来ないってとこでした。
エラーメッセージには、不正な値が見つかった場所から2バイトしか出力してくれない為、
パラメータにはどんな値がセットされていたのか全く分かりません。
URLデコード出来ない文字が含まれていてもパラメータを確認する方法がないか調べたところ、
request.getInputStream()またはrequest.getReader()を使えば、
URLデコードしないのでエラーが発生することなくパラメータを確認することが出来ることが判明。
が、ここで新たな問題が。
getInputStream()、getReader()、getParameter()はそれぞれ排他関係にあるらしく
同一のリクエストではどれか1つしか使えないようになっている!!
どういう事かというと、getInputStream()を1度でも実行すると、同一のrequestでgetParameter()は使用出来なくなります!!
逆に、getParameter()を実行するとgetInputStream()は使用出来なくなります。
し、知らなかった(^^;
getInputStreamで生のデータをログ出力し、
生のデータを自前でparseしてFormにセットする等すればいいんでしょうが、
既にgetParameterを使用し、Formに値がセットされている状態なので、
getInputStreamを使うことも出来ず。
リフレクションを使ってフラグを変えて、getInputStream後でもgetParameterが使えないか、
強引な方法も試してみましたが、結局出来ず。諦めました。(T-T)
アプリケーションサーバ:Wildfly 8.1.0
リクエストが届いたら、ログにパラメータを出力するようにしています。
いちいちパラメータ名をハードコーディングしてgetParameterするわけにもいかないので、
getParameterNamesを使って、要素分getParameterしてログに出力しています。
しかし、あるリクエストが来た際、getParameterNamesでエラーが発生!!
エラーの詳細は
java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string:
原因を調べてみると、
パラメータ名にURLデコード出来ない文字、例えば%ssという文字が含まれた状態でリクエストが飛んできているのが原因でした。
getParameterNamesを実行すると、内部でURLDecoderのdecodeメソッドを実行している為、
decodeメソッドで、そんなのデコード出来ない!!と怒っているようです。
まぁこの問題自体は別にどうでもいいんですが、
問題は、URLデコード出来ない文字がパラメータに含まれていると、getParameterNamesまたはgetParameterが出来ず、
パラメータがログに出力出来ないってとこでした。
エラーメッセージには、不正な値が見つかった場所から2バイトしか出力してくれない為、
パラメータにはどんな値がセットされていたのか全く分かりません。
URLデコード出来ない文字が含まれていてもパラメータを確認する方法がないか調べたところ、
request.getInputStream()またはrequest.getReader()を使えば、
URLデコードしないのでエラーが発生することなくパラメータを確認することが出来ることが判明。
が、ここで新たな問題が。
getInputStream()、getReader()、getParameter()はそれぞれ排他関係にあるらしく
同一のリクエストではどれか1つしか使えないようになっている!!
どういう事かというと、getInputStream()を1度でも実行すると、同一のrequestでgetParameter()は使用出来なくなります!!
逆に、getParameter()を実行するとgetInputStream()は使用出来なくなります。
し、知らなかった(^^;
getInputStreamで生のデータをログ出力し、
生のデータを自前でparseしてFormにセットする等すればいいんでしょうが、
既にgetParameterを使用し、Formに値がセットされている状態なので、
getInputStreamを使うことも出来ず。
リフレクションを使ってフラグを変えて、getInputStream後でもgetParameterが使えないか、
強引な方法も試してみましたが、結局出来ず。諦めました。(T-T)
PR
Comment