一個通過反射改變request的請求參數的方法

現在在做的項目需要用一個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的請求參數了!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章