ServletRequest#getParameterやgetInputStream, geReaderをコールした後、再度リクエストからHTTPリクエストBODY部を読み込もうとすると、読み込めない。

例えば、FilterにてFilterChain#doFilterする前にgetParameterをコールすると、その後のサーブレット等の処理でHTTPリクエストBODY部が読み込めなくなってしまった。

Javadocを確認したところ、なにやら怪しい記載が。。。

(抜粋)
HTTP POST リクエストで送ったなど、パラメータのデータがリクエストのメッセージボディで送られた場合、getInputStream() や getReader() メソッドを使って直接メッセージボディを読み込む操作は、このメソッドの実行に影響を与えることがあります。

Javadoc
http://mergedoc.sourceforge.jp/tomcat-servletapi-5-ja/javax/servlet/ServletRequest.html#getParameter%28java.lang.String%29

解決方法その1
HttpServletRequest#
getQueryStringを使用する。
ただし、リクエストがPOSTメソッドだとパラメータが取得できないので注意!
また、パラメータを取得する方法は以下を参照。

(サンプルメソッド)
private Map<String, String> getHTTPReqParam(String queryString) {
Map<String, String> resultMap = new HashMap<String, String>();
try{
if(!StringUtils.isEmpty(queryString)){
String[] kvs = queryString.split("&");
for(String kv:kvs){
String[] x = kv.split("=");
if( x.length>=2 ){
resultMap.put(x[0], x[1]);
}
}
}

}catch(Exception e){
e.printStackTrace();
}

return resultMap;
}

解決方法その2
リクエストからあらかじめgetInputStream()でデータを読み込んでバッファに格納し、リクエストのパラメータ・メッセージボディをバッファから読み込むというもの。
以下のページが参考になります。

ServletInputStreamを2回使う
http://d.hatena.ne.jp/machi_pon/20090120/1232420325

slim3のcontrollerでServletInputStreamを使いたいとき
http://blog.honestyworks.jp/blog/archives/162

この方法でPOSTでもGETでも対応可能です。
しかし、セッションを使用しているとバッファのデータをFilterChain#doFilterする際、セッション情報が消えてしまうので要注意!