From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-biz-common/jnpf-audit-sdk/src/main/java/jnpf/audit/sdk/aspect/AuditRequestTitleResolver.java |   72 ++++++++++++++++++++++++++++++++++++
 1 files changed, 72 insertions(+), 0 deletions(-)

diff --git a/jnpf-biz-common/jnpf-audit-sdk/src/main/java/jnpf/audit/sdk/aspect/AuditRequestTitleResolver.java b/jnpf-biz-common/jnpf-audit-sdk/src/main/java/jnpf/audit/sdk/aspect/AuditRequestTitleResolver.java
new file mode 100644
index 0000000..6071dbe
--- /dev/null
+++ b/jnpf-biz-common/jnpf-audit-sdk/src/main/java/jnpf/audit/sdk/aspect/AuditRequestTitleResolver.java
@@ -0,0 +1,72 @@
+package jnpf.audit.sdk.aspect;
+
+import jnpf.util.JsonUtil;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.List;
+import java.util.Map;
+
+/** Resolves the display-only audit title supplied by the scoped online form request wrapper. */
+final class AuditRequestTitleResolver {
+
+    static final String HEADER_NAME = "X-Audit-Display-Fields";
+    private static final int MAX_HEADER_LENGTH = 8192;
+    private static final int MAX_FIELDS = 50;
+    private static final int MAX_TITLE_LENGTH = 400;
+
+    private AuditRequestTitleResolver() {
+    }
+
+    static String resolveCurrentRequest() {
+        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+        if (!(attributes instanceof ServletRequestAttributes)) {
+            return null;
+        }
+        String encoded = ((ServletRequestAttributes) attributes).getRequest().getHeader(HEADER_NAME);
+        return resolveEncoded(encoded);
+    }
+
+    static String resolveEncoded(String encoded) {
+        if (encoded == null || encoded.isEmpty() || encoded.length() > MAX_HEADER_LENGTH) {
+            return null;
+        }
+        try {
+            String json = new String(Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8);
+            List<Map> fields = JsonUtil.getJsonToList(json, Map.class);
+            StringBuilder title = new StringBuilder();
+            int count = 0;
+            for (Map field : fields) {
+                if (field == null || count++ >= MAX_FIELDS) {
+                    break;
+                }
+                String value = clean(field.get("displayValue"));
+                if (value.isEmpty()) {
+                    continue;
+                }
+                int separatorLength = title.length() > 0 ? 1 : 0;
+                int remaining = MAX_TITLE_LENGTH - title.length() - separatorLength;
+                if (remaining <= 0) {
+                    break;
+                }
+                if (separatorLength > 0) {
+                    title.append('/');
+                }
+                title.append(value, 0, Math.min(value.length(), remaining));
+            }
+            return title.length() == 0 ? null : title.toString();
+        } catch (Throwable ignored) {
+            return null;
+        }
+    }
+
+    private static String clean(Object value) {
+        if (value == null) {
+            return "";
+        }
+        return String.valueOf(value).replace('\r', ' ').replace('\n', ' ').trim();
+    }
+}

--
Gitblit v1.8.0