关于在Spring过滤器中修改request的参数值遇到的问题(二)

来源:互联网 发布:萍乡网络电视台 编辑:程序博客网 时间:2024/05/21 22:33
  1. 背景
    见上一篇Blog关于在Spring过滤器中修改request的参数值遇到的问题(一)

  2. 问题描述
    Spring框架,使用过滤器解密request中的参数(修改Request中的值),并传递到下一个过滤器

  3. 错误详情
    第一次的修改方式是这样的(RSAUtil是封装的一个工具类,filed是前台input标签的name)

    String encryptVal = request.getParameter(filed);String decryptVal = RSAUtil.decryptStringByJs(encryptVal);request.setAttribute(filed, decryptVal);

    这样在下一个过滤器中根本无法用getParameter取到解密的值。debugger后发现request.getParameter(name)方法是从一个Map中获取的

    第二次修改

    Map<String, String[]> parameterMap = request.getParameterMap();String encryptVal = request.getParameter(filed);String decryptVal = RSAUtil.decryptStringByJs(encryptVal);parameterMap.put(filed, decryptVal);

    可是这次运行直接报错:不能更改一个锁定的Map,好吧,百度百度,找到解决方案

  4. 解决方案
    定义一个request的包装类

    import org.apache.catalina.util.ParameterMap;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.util.Map;public class ParameterRequestWrapper extends HttpServletRequestWrapper {    private ParameterMap<String, String[]> params;    @SuppressWarnings("all")    public ParameterRequestWrapper(HttpServletRequest request) {        super(request);        params = (ParameterMap) request.getParameterMap();        // TODO Auto-generated constructor stub    }    @Override    public String getParameter(String name) {        // TODO Auto-generated method stub        String[] values = params.get(name);        if (values == null || values.length == 0) {            return null;        }        return values[0];    }    @Override    public Map<String, String[]> getParameterMap() {        // TODO Auto-generated method stub        return params;    }    public void addParameter(String name, Object value) {// 增加参数        if (value != null) {            params.setLocked(false);            if (value instanceof String[]) {                params.put(name, (String[]) value);            } else if (value instanceof String) {                params.put(name, new String[] { (String) value });            } else {                params.put(name, new String[] { String.valueOf(value) });            }            params.setLocked(true);        }    }}

    使用该包装类

    ParameterRequestWrapper newRequest = new ParameterRequestWrapper(request);String encryptVal = request.getParameter(filed);String decryptVal = RSAUtil.decryptStringByJs(encryptVal);newRequest.addParameter(filed, decryptVal);

这下是搞定了,在之后的任何地方都可以用request.getParameter()来取得解密后的参数了

总结:有时候百度还是可以解决问题的,但接下来遇到的问题很尴尬百度没有,见“关于在Spring过滤器中修改request的参数值遇到的问题(三)”

阅读全文
0 0
原创粉丝点击