Magnolia Tech

techっぽいことを書くブログです

ServletのrequestオブジェクトのgetParameterメソッドを使うとinputStreamが空っぽになっている

https://javaee.github.io/servlet-spec/downloads/servlet-3.1/Final/servlet-3_1-final.pdf

上記Servletの仕様書のセクション3.1.1に書かれている通りなんですけどね。

  • POST method
  • content typeがapplication/x-www-form-urlencoded
  • requestオブジェクトのgetParameter系のメソッドを呼び出す

という条件が揃うと、servletコンテナ側でinputStreamが消費されてしまうので、アプリケーション側で読み込むことができない、とのこと。

読み込み用のメソッドを使っただけでオブジェクトの状態が変わるのって…という感じですが、アプリケーション側からするとraw dataの状態で検査したいことも有ったりして、おせっかいな機能ですね。

ほかにもbody部のパラメータと、URLのパラメータを勝手に1つのMapにミックスしたりと、「それ必要?」感の有る仕様が有ったりしますね。

servletベースのWAFはどうやって回避しているのでしょうか?

Scalatraでずっとissueが残っていますが、特にservletがバージョンアップしても回避策は無さそうなので、APIに注意喚起するPRだけ作っておきました。

github.com