在spring开发过程中,我们有时候需要对某些参数进行处理,对通过API提交的参数进入校验等情况。实现的原理是在过滤器中进行处理,相关代码如下:
我们新建一个 RequestWrapperParam 类
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
/**
* @author SHE
*/
public class RequestWrapperParam extends HttpServletRequestWrapper {
private Map params = new HashMap<>();
public RequestWrapperParam(HttpServletRequest request, Map newParams) {
super(request);
if(request.getParameterMap() != null){
this.params.putAll(request.getParameterMap());
}
if(newParams != null){
this.params.putAll(newParams);
}
}
/**
* 获取参数
* @return
*/
@Override
public Map getParameterMap() {
return params;
}
@Override
public Enumeration getParameterNames() {
Vector l = new Vector(params.keySet());
return l.elements();
}
@Override
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()};
}
}
/**
* 根据参数的key获取参数
* @param name
* @return
*/
@Override
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();
}
}
}
在过滤器中处理 deviceCode 的这个参数,对其值进行处理,添加以下代码
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String devCode = request.getParameter("deviceCode");
if(CharSequenceUtil.isNotBlank(devCode)) {
Map<String, String[]> newParameterMap = new HashMap<>();
newParameterMap.put("deviceCode", new String[]{ConvertUtils.prefixDeviceCode(devCode)});
RequestWrapperParam requestWrapperParam = new RequestWrapperParam((HttpServletRequest) request, newParameterMap);
filterChain.doFilter(requestWrapperParam,response);
} else {
filterChain.doFilter(request,response);
}
}
其中 ConvertUtils.prefixDeviceCode 是处理函数。
public static String prefixDeviceCode(String deviceCode) {
if(deviceCode.substring(0,2).equals(CloudConstans.Basic.PARAM_PREFIX)) {
return "20".concat(deviceCode.substring(2, deviceCode.length()));
}
return deviceCode;
}