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/AuditRequestScopeFilter.java |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/jnpf-biz-common/jnpf-audit-sdk/src/main/java/jnpf/audit/sdk/AuditRequestScopeFilter.java b/jnpf-biz-common/jnpf-audit-sdk/src/main/java/jnpf/audit/sdk/AuditRequestScopeFilter.java
new file mode 100644
index 0000000..9181cc0
--- /dev/null
+++ b/jnpf-biz-common/jnpf-audit-sdk/src/main/java/jnpf/audit/sdk/AuditRequestScopeFilter.java
@@ -0,0 +1,56 @@
+package jnpf.audit.sdk;
+
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Locale;
+import java.util.Set;
+
+/** Restricts SDK audit events to configured application request sources. */
+public class AuditRequestScopeFilter {
+
+    private static final String HEADER_APP_CODE = "App-Code";
+    private static final String HEADER_APP_SCOPE = "Jnpf-App-Scope";
+
+    private final boolean frontendOnly;
+    private final Set<String> allowedAppCodes;
+
+    public AuditRequestScopeFilter(boolean frontendOnly, String allowedAppCodes) {
+        this.frontendOnly = frontendOnly;
+        Set<String> normalized = new LinkedHashSet<>();
+        if (allowedAppCodes != null) {
+            for (String code : allowedAppCodes.split(",")) {
+                if (code != null && !code.trim().isEmpty()) {
+                    normalized.add(code.trim().toUpperCase(Locale.ROOT));
+                }
+            }
+        }
+        this.allowedAppCodes = normalized.isEmpty()
+                ? Collections.emptySet() : Collections.unmodifiableSet(normalized);
+    }
+
+    public boolean acceptsCurrentRequest() {
+        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+        if (!(attributes instanceof ServletRequestAttributes)) {
+            return accepts(null, null);
+        }
+        ServletRequestAttributes servletAttributes = (ServletRequestAttributes) attributes;
+        return accepts(servletAttributes.getRequest().getHeader(HEADER_APP_SCOPE),
+                servletAttributes.getRequest().getHeader(HEADER_APP_CODE));
+    }
+
+    public boolean accepts(String appScope, String appCode) {
+        if (frontendOnly && !"FRONTEND".equalsIgnoreCase(trim(appScope))) {
+            return false;
+        }
+        return allowedAppCodes.isEmpty()
+                || allowedAppCodes.contains(trim(appCode).toUpperCase(Locale.ROOT));
+    }
+
+    private static String trim(String value) {
+        return value == null ? "" : value.trim();
+    }
+}

--
Gitblit v1.8.0