最近有个项目,客户端发送的参数格式为jsondata={},我的服务端需要的其中的参数值,所以做了一个filter统一解析。问题来了,直接修改req.getParameterMap().put(key, ob.get(key)); 会报错java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap。网上查了一些资料,解决方案是使用Wrapper。
1、先新建一个类ParameterRequestWrapper 继承自HttpServletRequestWrapper,代码如下:
private Map params;
public ParameterRequestWrapper(HttpServletRequest request,Map newParams) {
super(request);
this.params=newParams;
}
public Map getParameterMap() {
return params;
}
public Enumeration getParameterNames() {
Vector l=new Vector(params.keySet());
return l.elements();
}
public String[] getParameterValues(String name) {
Object v = params.get(name);
if(v==null){
return null;
}else if(v instanceof String[]){
return (String[]) v;
}else if(v instanceof String){
return new String[]{(String) v};
}else{
return new String[]{v.toString()};
}
}
public String getParameter(String name) {
Object v = params.get(name);
if(v==null){
return null;
}else if(v instanceof String[]){
String []strArr=(String[]) v;
if(strArr.length>0){
return strArr[0];
}else{
return null;
}
}else if(v instanceof String){
return (String) v;
}else{
return v.toString();
}
}
2、在filter中修改parameters,
HttpServletRequest req = (HttpServletRequest) request;
String jsondata = req.getParameter("jsondata");
JSONObject ob = JSONObject.fromObject(jsondata);
HashMap m=new HashMap(request.getParameterMap());
Set<String> keys = ob.keySet();
for (String key : keys) {
m.put(key, ob.get(key));
}
ParameterRequestWrapper wrapRequest=new ParameterRequestWrapper(req,m);
chain.doFilter(wrapRequest, response);
收工!