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(无需登录) *

* 前端 SPA 页面加载时调用此接口记录访问。 * Nginx 需配置 proxy_set_header 传递国家和真实IP: *

 *   proxy_set_header X-Real-IP $remote_addr;
 *   proxy_set_header X-Geo-Country $geoip_country_code;
 * 
* * @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("记录失败"); } } }