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 参数处理流程
- 从请求体读取原始数据
- 判断参数格式 (JSON 或表单)
- 转换参数为 Map 结构
- 处理特殊字符和编码
3. 最佳实践
- 字符编码:
- 始终设置请求字符编码:
request.setCharacterEncoding("UTF-8")
- 对 URL 参数进行编码:
URLEncoder.encode(param, "UTF-8")
- 异常处理:
- 处理 IO 异常和 JSON 解析异常
- 对空参数进行校验
- 性能考虑:
- 对于大请求体,使用流式处理
- 缓存 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