在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;
}