Struts2
首先要知道Struts2 参数映射对应的是request.getPrameterMap中的键值,所以过滤器中修改过滤这块这实现参数修改。
Map parameterMap = request.getParameterMap();
Method method = parameterMap.getClass().getMethod(“setLocked”, new Class[]{boolean.class});
method.invoke(parameterMap, new Object[]{new Boolean(false)});
parameterMap.remove(“encryptParams”); 去掉key为encryptParams的参数
parameterMap.put(“encryptParams”); 增加key为encryptParams的参数
method.invoke(parameterMap, new Object[]{new Boolean(true)});
阅读源码可知道修改parameterMap中参数的方法是加了锁的,需要先将锁打开,再做操作,操作完记得关上。
SpringMVC
继承HttpServletRequestWrapper,重写request中getParameter,getParameterValues以及getParameterNames方法。
class ParamServletRequestWrapper extends HttpServletRequestWrapper {
private Map<String , String[]> params = new HashMap<String, String[]>();
public ParamServletRequestWrapper(HttpServletRequest request) throws IOException{
super(request);
this.params.putAll(request.getParameterMap());
}
public void addAllParameters(Map<String, Object> extraParams) {
for (Map.Entry<String, Object> entry : extraParams.entrySet()) {
setParameter(entry.getKey(), entry.getValue());
}
}
public void setParameter(String name, Object value) {
if (value != null) {
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)});
}
}
}
@Override
public Enumeration<String> getParameterNames() {
Vector<String> vector = new Vector<String>(params.keySet());
return vector.elements();
}
/**
* 重写getParameter,代表参数从当前类中的map获取
* @param name
* @return
*/
@Override
public String getParameter(String name) {
String[]values = params.get(name);
if(values == null || values.length == 0) {
return null;
}
return values[0];
}
/**
* 重写getParameterValues方法,从当前类的 map中取值
* @param name
* @return
*/
@Override
public String[] getParameterValues(String name) {
return params.get(name);
}
}
直接调用addAllParameters 直接调用实现参数增加。
总结
Struts2和SpringMVC底层机制不同,Struts2 入口是filter,SpirngMVC入口为servlet,导致修改request中的地方不一样,若项目中同时存在两种架构,则过滤器同时实现上面两种方式即可对参数进行修改。