HttpServletRequest的getParameter()在POST/GET请求下为何表现不同
问题本质
request.getParameter() 仅针对**application/x-www-form-urlencoded**类型的请求参数生效:
- GET请求的URL查询参数属于这类场景,Servlet容器会自动按请求字符集解码,所以
%2B会被转成+。 - 你当前的POST请求是JSON格式(
Content-Type: application/json),request.getParameter()不会解析JSON请求体,拿到的%2B只是原始JSON字符串里的未转义值,并非经过解码的结果。
正确处理方案
1. GET参数获取
直接使用request.getParameter()即可,容器已自动完成解码:
String getParam = request.getParameter("get"); // 结果为 "+"
2. POST JSON参数获取
需要先读取完整请求体,再用JSON解析库解析,最后手动解码参数值:
读取请求体
BufferedReader reader = request.getReader(); StringBuilder jsonBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { jsonBuilder.append(line); } String rawJson = jsonBuilder.toString();
用Jackson解析并解码(示例)
// 初始化Jackson的ObjectMapper ObjectMapper mapper = new ObjectMapper(); // 用Map接收解析结果,或自定义实体类 Map<String, String> paramMap = mapper.readValue(rawJson, new TypeReference<Map<String, String>>() {}); String encodedPostParam = paramMap.get("post"); // 手动URL解码 String decodedPostParam = java.net.URLDecoder.decode(encodedPostParam, StandardCharsets.UTF_8.name()); // 解码后结果为 "+"
如果用自定义实体类:
// 定义对应JSON结构的实体类 class PostRequest { private String post; // 必须提供getter/setter public String getPost() { return post; } public void setPost(String post) { this.post = post; } } PostRequest requestBody = mapper.readValue(rawJson, PostRequest.class); String decodedPostParam = URLDecoder.decode(requestBody.getPost(), StandardCharsets.UTF_8.name());
补充:表单编码的POST请求
如果你的POST请求是application/x-www-form-urlencoded类型(而非JSON),直接用request.getParameter("post")就能自动拿到解码后的+,和GET参数处理逻辑一致。
内容的提问来源于stack exchange,提问作者1ang
相关产品推荐
相关产品推荐

