背景
见上一篇Blog关于在Spring过滤器中修改request的参数值遇到的问题(一)问题描述
Spring框架,使用过滤器解密request中的参数(修改Request中的值),并传递到下一个过滤器错误详情
第一次的修改方式是这样的(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,好吧,百度百度,找到解决方案
解决方案
定义一个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的参数值遇到的问题(三)”