|
|
@@ -0,0 +1,113 @@
|
|
|
+package com.ljsd.util;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.io.BufferedReader;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.Enumeration;
|
|
|
+import java.util.LinkedHashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 打印表单请求和JSON请求的工具类
|
|
|
+ */
|
|
|
+public class RequestLogger {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据请求类型(表单/JSON)打印参数,并返回字符串用于日志
|
|
|
+ */
|
|
|
+ public static String logRequestParams(HttpServletRequest request) throws IOException {
|
|
|
+ String contentType = request.getContentType();
|
|
|
+ if (contentType == null) {
|
|
|
+ return "请求Content-Type为空";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理表单请求(application/x-www-form-urlencoded)
|
|
|
+ if (contentType.contains("application/x-www-form-urlencoded")) {
|
|
|
+ return logFormParams(request);
|
|
|
+ }
|
|
|
+ // 处理JSON请求(application/json)
|
|
|
+ else if (contentType.contains("application/json")) {
|
|
|
+ return logJsonParams(request);
|
|
|
+ }
|
|
|
+ // 其他类型
|
|
|
+ else {
|
|
|
+ return "不支持的Content-Type:" + contentType;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打印表单参数(返回格式化字符串)
|
|
|
+ */
|
|
|
+ private static String logFormParams(HttpServletRequest request) {
|
|
|
+ Map<String, String> paramMap = new LinkedHashMap<>();
|
|
|
+ // 获取所有表单参数名
|
|
|
+ Enumeration<String> paramNames = request.getParameterNames();
|
|
|
+ while (paramNames.hasMoreElements()) {
|
|
|
+ String name = paramNames.nextElement();
|
|
|
+ // 获取参数值(如果是多值参数,取第一个值)
|
|
|
+ String value = request.getParameter(name);
|
|
|
+ paramMap.put(name, value);
|
|
|
+ }
|
|
|
+ // 格式化为 "key1=value1; key2=value2"
|
|
|
+ return formatParamString(paramMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打印JSON参数(返回格式化字符串)
|
|
|
+ */
|
|
|
+ private static String logJsonParams(HttpServletRequest request) throws IOException {
|
|
|
+ // 读取请求体JSON
|
|
|
+ StringBuilder jsonSb = new StringBuilder();
|
|
|
+ BufferedReader reader = request.getReader();
|
|
|
+ String line;
|
|
|
+ while ((line = reader.readLine()) != null) {
|
|
|
+ jsonSb.append(line.trim());
|
|
|
+ }
|
|
|
+ String json = jsonSb.toString();
|
|
|
+
|
|
|
+ // 简单解析单层JSON(仅支持key-value结构)
|
|
|
+ Map<String, String> paramMap = parseSimpleJson(json);
|
|
|
+ // 格式化为 "key1=value1; key2=value2"
|
|
|
+ return formatParamString(paramMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 简单解析单层JSON(辅助方法)
|
|
|
+ */
|
|
|
+ private static Map<String, String> parseSimpleJson(String json) {
|
|
|
+ Map<String, String> paramMap = new LinkedHashMap<>();
|
|
|
+ if (json == null || json.trim().isEmpty()) {
|
|
|
+ return paramMap;
|
|
|
+ }
|
|
|
+ // 去除首尾大括号
|
|
|
+ json = json.trim().replaceAll("^\\{|\\}$", "");
|
|
|
+ // 分割键值对
|
|
|
+ String[] pairs = json.split(",");
|
|
|
+ for (String pair : pairs) {
|
|
|
+ pair = pair.trim();
|
|
|
+ if (pair.isEmpty()) continue;
|
|
|
+ // 分割key和value(处理冒号前后的空格)
|
|
|
+ String[] kv = pair.split(":", 2);
|
|
|
+ if (kv.length != 2) continue;
|
|
|
+ // 去除引号和空格
|
|
|
+ String key = kv[0].trim().replace("\"", "");
|
|
|
+ String value = kv[1].trim().replace("\"", "");
|
|
|
+ paramMap.put(key, value);
|
|
|
+ }
|
|
|
+ return paramMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 格式化参数字符串(辅助方法)
|
|
|
+ */
|
|
|
+ private static String formatParamString(Map<String, String> paramMap) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ for (Map.Entry<String, String> entry : paramMap.entrySet()) {
|
|
|
+ if (sb.length() > 0) {
|
|
|
+ sb.append("; ");
|
|
|
+ }
|
|
|
+ sb.append(entry.getKey()).append("=").append(entry.getValue());
|
|
|
+ }
|
|
|
+ return sb.toString();
|
|
|
+ }
|
|
|
+}
|