From aeb0696f457ca85b62d15ab6586c5779cf5cd97b Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Fri, 31 Jul 2026 16:56:21 +0800
Subject: [PATCH] feat(firewall): 添加访问日志功能
---
src/main/java/cc/mrbird/febs/firewall/controller/ApiTrackController.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 52 insertions(+), 0 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/firewall/controller/ApiTrackController.java b/src/main/java/cc/mrbird/febs/firewall/controller/ApiTrackController.java
new file mode 100644
index 0000000..9eda9ea
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/firewall/controller/ApiTrackController.java
@@ -0,0 +1,52 @@
+package cc.mrbird.febs.firewall.controller;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.firewall.entity.FirewallAccessLog;
+import cc.mrbird.febs.firewall.service.IFirewallRuleService;
+import cn.hutool.extra.servlet.ServletUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 公开访问追踪API(无需登录)
+ * <p>
+ * 前端 SPA 页面加载时调用此接口记录访问。
+ * Nginx 需配置 proxy_set_header 传递国家和真实IP:
+ * <pre>
+ * proxy_set_header X-Real-IP $remote_addr;
+ * proxy_set_header X-Geo-Country $geoip_country_code;
+ * </pre>
+ *
+ * @author auto-generated
+ * @date 2026-07-31
+ */
+@Slf4j
+@RestController
+@RequestMapping("api/track")
+@RequiredArgsConstructor
+public class ApiTrackController {
+
+ private final IFirewallRuleService firewallRuleService;
+
+ @GetMapping("visit")
+ public FebsResponse trackVisit(HttpServletRequest request) {
+ try {
+ FirewallAccessLog accessLog = new FirewallAccessLog();
+ accessLog.setIp(ServletUtil.getClientIP(request));
+ accessLog.setCountryCode(request.getHeader("X-Geo-Country"));
+ accessLog.setUserAgent(request.getHeader("User-Agent"));
+ accessLog.setRequestUri(request.getHeader("Referer"));
+ accessLog.setIsBlocked(0);
+ firewallRuleService.recordAccess(accessLog);
+ return new FebsResponse().success();
+ } catch (Exception e) {
+ log.error("访问追踪记录失败", e);
+ return new FebsResponse().fail().message("记录失败");
+ }
+ }
+}
--
Gitblit v1.9.1