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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_29092471/article/details/73556088
  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的参数值遇到的问题(三)”

猜你喜欢

转载自blog.csdn.net/baidu_29092471/article/details/73556088