現在在做的項目需要用一個WebWork攔截器從request的請求參數中讀取一些數據並把它們從parameterMap中remove掉。
一開始這樣寫:
Map requestParams=request.getParameterMap();
......
requestParams.remove("key");
運行時會報錯誤:
Cannot find message associated with key parameterMap.locked
at org.apache.catalina.util.ParameterMap.remove(ParameterMap.java:204)
從輸出的錯誤信息發現,原來request.getParameterMap();返回的不是一般的Map,而是org.apache.catalina.util.ParameterMap!
反編譯ParameterMap,發現其繼承自HashMap:
public final class ParameterMap extends HashMap
其中有一個加鎖的方法,問題就出在這裏了:
public void setLocked(boolean locked)
{
this.locked = locked;
}
其他所有修改內容的方法,都會判斷是否上鎖。如果處於鎖定狀態,就會拋出異常,比如最常用的put方法:
public Object put(Object key, Object value)
{
if(locked)
throw new IllegalStateException(sm.getString("parameterMap.locked"));
else
return super.put(key, value);
}
原來如此!
於是,從Tomcat下拷來了catalina.jar,代碼寫成
ParameterMap requestParams=(ParameterMap)request.getParameterMap();
requestParams.setLocked(false);
requestParams.remove("key");
......
運行時還是報類型轉換錯誤:不能從org.apache.catalina.util.ParameterMap轉換爲org.apache.catalina.util.ParameterMap
用instanceof判斷,返回的也是false,有點暈,呵呵
最後,只好用反射來搞定了:
Method method=requestParams.getClass().getMethod("setLocked",new Class[]{boolean.class});
method.invoke(requestParams,new Object[]{new Boolean(false)});
OK!運行通過!鎖定已經接觸,可以像操作普通的Map一樣,修改request的請求參數了!