3

HttpServletRequest一部のパラメータを削除/変更する必要があります。数日前に投稿した質問Filterに基づいて、そうしようとしています。

で、次のようにクラスを継承しFilterてラップしようとしています。HttpServletRequestHttpServletRequestWrapper

private final static class FilteredRequest extends HttpServletRequestWrapper {

    public FilteredRequest(ServletRequest request) {
        super((HttpServletRequest) request);
    }

    @Override
    public String getParameter(String paramName) {
        return super.getParameter(paramName);
    }

    @Override
    public String[] getParameterValues(String paramName) {
        return super.getParameterValues(paramName);
    }

    @Override
    public Map getParameterMap() {
        Map<Object, Object> parameterMap = new HashMap<Object, Object>();
        Map originalParameterMap = super.getParameterMap();

        for (Object o : originalParameterMap.entrySet()) {
            Map.Entry<Object, Object> pairs = (Entry<Object, Object>) o;
            parameterMap.put(pairs.getKey(), pairs.getValue());
        }
        return parameterMap;  //Returning a modifiable ParameterMap.
    }
}

これは、クラス内の内部Filterクラスです。このdoFilter()方法では、

chain.doFilter(new FilteredRequest(request), (HttpServletResponse)response);

上記のクラスのコンストラクターが呼び出されています(リクエストをラップします)。


さて、 SpringMVCコントローラークラスでリクエストパラメーターのいずれかが変更/設定解除されることを期待しています。次のように、コントローラークラスのパラメーターを削除しようとしています。

Map requestMap=request.getParameterMap();
requestMap.remove("txt_country_name");

または、

requestMap.put("txt_country_name", null);

したがって、リクエストパラメータは削除するtxt_country_name必要がありますが、削除されません(また、「ロックされたパラメータマップへの変更は許可されていませんHttpServletRequest」などの例外もスローされません)。ここで何が欠けていますか?私は間違った方法に従っていますか?

ちなみに、アプリケーション全体で常にリクエスト属性を作成/使用することは、最善の解決策ではないようです

[ Spring MVCコントローラークラス内ではなく、 SpringMVCコントローラークラス内でリクエストパラメーターを削除/変更する必要がありFilterます]

4

1 に答える 1

4

removeメソッドは、によって返される可変マップを変更しgetParameterMap()ます。ただし、次の呼び出しgetParameterMap()は、ラップされたクエリのすべてのパラメータを含む新しい可変マップを再構築します。

可変マップは、の作成時に作成する必要がFilteredRequestあり、インスタンスフィールドに格納する必要があります。

于 2012-07-25T22:02:33.230 に答える