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する際、セッション情報が消えてしまうので要注意!
例えば、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する際、セッション情報が消えてしまうので要注意!