将BufferedReader读取的请求体转为String时出现URL编码字符,如何处理?
解决Servlet中请求体URL编码字符的清理问题
嘿,这个问题我之前也踩过坑!你看到的%22、%3A这些字符其实都是URL编码后的特殊字符——比如%22对应双引号",%3A对应冒号:,%2C对应逗号,,之所以会出现在读取的内容里,是因为请求体是以URL编码的格式传递的,而你直接用getReader()读取了原始的编码内容。
下面给你两种靠谱的解决方法:
方法一:用URLDecoder直接解码整个请求体
这是最直接的方式,读取完原始内容后,用Java自带的URLDecoder类对字符串进行解码,记得指定正确的字符集(一般是UTF-8),避免解码后出现乱码。
修改后的代码示例:
import java.net.URLDecoder; import java.nio.charset.StandardCharsets; // 其他必要导入... protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { StringBuilder buffer = new StringBuilder(); BufferedReader reader = req.getReader(); String line; while ((line = reader.readLine()) != null) { buffer.append(line); } // 核心解码步骤 String decodedContent = URLDecoder.decode(buffer.toString(), StandardCharsets.UTF_8.name()); // 现在decodedContent就是正常可读的内容了,比如会变成 {"eventType":"created","transactionId":"573975943"...} System.out.println(decodedContent); }
注意:如果你的JDK版本低于1.7,
StandardCharsets.UTF_8不可用,直接用字符串"UTF-8"代替即可。
方法二:利用ServletRequest的参数解析(针对特定Content-Type)
如果你的请求Content-Type是application/x-www-form-urlencoded(常见的表单提交格式),其实可以不用手动读请求体,直接用Servlet提供的参数方法获取解码后的值:
// 比如获取eventType参数 String eventType = req.getParameter("eventType"); // 获取所有参数的Map Map<String, String[]> paramMap = req.getParameterMap();
不过这种方法只适用于请求体是键值对格式的情况,如果请求体是一个完整的URL编码后的JSON字符串,还是方法一更适用。
内容的提问来源于stack exchange,提问作者user1163234
相关产品推荐
相关产品推荐

