文章

HttpServletRequest参数获取方法总结

1. 常见参数获取方式

1.1 GET 请求参数

// 获取单个参数
String param = request.getParameter("paramName");

// 获取所有参数
Map<String, String[]> paramMap = request.getParameterMap();

1.2 POST 请求参数

// 表单格式参数
String formParam = request.getParameter("formParam");

// JSON 格式参数 (使用工具类)
Map<String, Object> jsonParams = WebUtils.getPostParam(request, "UTF-8");

2. WebUtils 工具类详解

2.1 核心方法

/**
 * 从 HttpServletRequest 获取 POST 参数
 * @param request HttpServletRequest 对象
 * @param charset 字符编码
 * @return 参数 Map
 */
public static Map<String, Object> getPostParam(HttpServletRequest request, String charset)

2.2 参数处理流程

  1. 从请求体读取原始数据
  2. 判断参数格式 (JSON 或表单)
  3. 转换参数为 Map 结构
  4. 处理特殊字符和编码

3. 最佳实践

  1. 字符编码
  • 始终设置请求字符编码:request.setCharacterEncoding("UTF-8")
  • 对 URL 参数进行编码:URLEncoder.encode(param, "UTF-8")
  1. 异常处理
  • 处理 IO 异常和 JSON 解析异常
  • 对空参数进行校验
  1. 性能考虑
  • 对于大请求体,使用流式处理
  • 缓存 ObjectMapper 实例

4. 完整示例

// 获取 POST 请求参数示例
Map<String, Object> params = WebUtils.getPostParam(request, "UTF-8");
if(params != null) {
    Object value = params.get("key");
    // 业务处理...
}
package cn.phixlin;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class WebUtils {

    public static ObjectMapper objectMapper;

    public static Map<String, Object> getPostParam(HttpServletRequest request, String charset) throws Exception {
        Map<String, Object> result = null;

        StringBuilder sb = new StringBuilder();

        request.setCharacterEncoding(charset);
        ServletInputStream inputStream = request.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, charset));

        String s;
        while ((s = bufferedReader.readLine()) != null){sb.append(s);
        }

        if (sb.length() > 0){result = paramsStrToMap(sb.toString(), charset);}

        return result;

    }

    private static Map<String, Object> paramsStrToMap(String params, String charset) throws Exception {
        if (params.startsWith("{")) {
            return paramsJsonStrToMap(params, charset);
        } else {
            Map<String, Object> result = new HashMap<>();
            String[] arr = params.split("&");

            for (String a : arr) {
                if (!StringUtils.isEmpty(a)) {String[] arr2 = a.split("=");
                    result.put(arr2[0], arr2.length > 1 ? arr2[1] : "");}
            }

            return result;
        }
    }


    private static Map<String, Object> paramsJsonStrToMap(String params, String charset) throws Exception {

        int noException = 0;
        while (noException < 2) {
            try {
                return objectMapper.readValue(params, Map.class);
            } catch (Exception e) {
                if (noException == 1) {
                    throw e;
                }
                params = replaceSpecialStr(params);
                params = encodeJSONStr(params, charset);
                noException++;
            }
        }
        return new HashMap<>();}

    private static String encodeJSONStr(String str, String charset) throws Exception {

        String tempStr = str.substring(1, str.length() - 1);
        String[] arr = tempStr.split(",");
        StringBuilder sb = new StringBuilder();

        for (String s : arr) {String[] arr2 = s.split(":");
            if (arr2.length <= 1) {
                sb.append(",").append(s);
            } else {
                String temps = arr2[1];
                if (temps.startsWith("\"")) {
                    temps = temps.substring(1, temps.length() - 1);
                    temps = String.format("\"%s\"", URLEncoder.encode(temps, charset));
                } else {temps = URLEncoder.encode(temps, charset);
                }

                s = arr2[0] + ":" + temps;
                sb.append(",").append(s);
            }
        }

        tempStr = sb.substring(1);
        return String.format("{%s}", tempStr);}

    private static String replaceSpecialStr(String str) {
        String repl = "";
        if (str != null) {
            Pattern p = Pattern.compile("\\s*|\t|\r|\n");
            Matcher m = p.matcher(str);
            repl = m.replaceAll("");}

        return repl;
    }

}

License:  CC BY 4.0