Ver Fonte

新增接口日志

tsurumure há 8 meses atrás
pai
commit
ed3ab91f7f

+ 23 - 0
src/main/java/com/backendsys/modules/common/config/WebConfig.java

@@ -0,0 +1,23 @@
+package com.backendsys.modules.common.config;
+
+import com.backendsys.modules.common.interceptor.ApiLogInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+    @Value("${API_LOG}")
+    private Boolean API_LOG;
+    @Autowired
+    private ApiLogInterceptor apiLogInterceptor;
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        // [拦截器] API日志
+        if (API_LOG) registry.addInterceptor(apiLogInterceptor);
+    }
+}

+ 3 - 3
src/main/java/com/backendsys/modules/common/config/security/entity/SecurityUserInfo.java

@@ -10,12 +10,12 @@ public class SecurityUserInfo {
     private Long id;
     private Long user_id;
     private String username;
-    private String last_login_ip;
+//    private String last_login_ip;
     private String last_login_uuid;
-    private String last_login_time;
+//    private String last_login_time;
     private Integer is_super;
     private String token_expiration;
-    private String create_time;
+//    private String create_time;
     private String target;
     private List<Map<String, Object>> roles;
     private List<String> modules;

+ 5 - 2
src/main/java/com/backendsys/modules/common/config/security/utils/HttpRequestUtil.java

@@ -11,6 +11,7 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.Map;
 
 @Component
 public class HttpRequestUtil {
@@ -35,7 +36,8 @@ public class HttpRequestUtil {
         if (request != null) {
             Claims tokenInfo = tokenUtil.getTokenInfo(request);
             if (tokenInfo != null) {
-                return Convert.toLong(tokenInfo.get("user_id"));
+                Map<String, Object> userInfo = (Map<String, Object>) tokenInfo.get("userInfo");
+                return Convert.toLong(userInfo.get("user_id"));
             }
         }
         return null;
@@ -49,7 +51,8 @@ public class HttpRequestUtil {
         if (request != null) {
             Claims tokenInfo = tokenUtil.getTokenInfo(request);
             if (tokenInfo != null) {
-                return Convert.toLong(tokenInfo.get("member_id"));
+                Map<String, Object> userInfo = (Map<String, Object>) tokenInfo.get("userInfo");
+                return Convert.toLong(userInfo.get("member_id"));
             }
         }
         return null;

+ 32 - 32
src/main/java/com/backendsys/modules/common/config/security/utils/JwtUtil.java

@@ -47,42 +47,42 @@ public class JwtUtil {
      * @param securityUserInfo
      * @return
      */
-    public String createJwtToken(SecurityUserInfo securityUserInfo) {
+    public String createSystemJwtToken(SecurityUserInfo securityUserInfo) {
         return Jwts.builder()
-                // subject 代表这个JWT的主体,即它的所有人
-                .subject(securityUserInfo.getLast_login_uuid())
-                .claim("userInfo", securityUserInfo)
-                .claim("target", "System")
-                .signWith(getSignInKey())
-                .expiration(Convert.toDate(securityUserInfo.getToken_expiration()))
-                .compact();
+            // subject 代表这个JWT的主体,即它的所有人
+            .subject(securityUserInfo.getLast_login_uuid())
+            .claim("userInfo", securityUserInfo)
+            .claim("target", "System")
+            .signWith(getSignInKey())
+            .expiration(Convert.toDate(securityUserInfo.getToken_expiration()))
+            .compact();
     }
 
 
-    /**
-     * 创建Token (即将弃用)
-     */
-    public String createSystemToken(Map<String, Object> sysUser) {
-
-        System.out.println("createSystemToken:");
-        System.out.println(sysUser);
-
-        Date expiration = (Date) sysUser.get("token_expiration");   // 过期时间由 isRemember 决定
-        return Jwts.builder()
-                // subject 代表这个JWT的主体,即它的所有人
-                .subject(String.valueOf(sysUser.get("last_login_uuid")))
-                .claim("user_id", sysUser.get("id"))
-                .claim("username", sysUser.get("username"))
-                .claim("is_super", sysUser.get("is_super"))
-                .claim("modules", sysUser.get("modules"))
-                .claim("target", "System")
-
-                .claim("UserInfo", JSONUtil.toJsonStr(sysUser))
-
-                .signWith(getSignInKey())
-                .expiration(expiration)
-                .compact();
-    }
+//    /**
+//     * 创建Token (即将弃用)
+//     */
+//    public String createSystemToken(Map<String, Object> sysUser) {
+//
+//        System.out.println("createSystemToken:");
+//        System.out.println(sysUser);
+//
+//        Date expiration = (Date) sysUser.get("token_expiration");   // 过期时间由 isRemember 决定
+//        return Jwts.builder()
+//            // subject 代表这个JWT的主体,即它的所有人
+//            .subject(String.valueOf(sysUser.get("last_login_uuid")))
+//            .claim("user_id", sysUser.get("id"))
+//            .claim("username", sysUser.get("username"))
+//            .claim("is_super", sysUser.get("is_super"))
+//            .claim("modules", sysUser.get("modules"))
+//            .claim("target", "System")
+//
+//            .claim("UserInfo", JSONUtil.toJsonStr(sysUser))
+//
+//            .signWith(getSignInKey())
+//            .expiration(expiration)
+//            .compact();
+//    }
 
 
 

+ 2 - 1
src/main/java/com/backendsys/modules/common/config/security/utils/TokenUtil.java

@@ -11,6 +11,7 @@ import org.springframework.security.core.Authentication;
 import org.springframework.stereotype.Service;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.util.StringUtils;
 
 @Service
 public class TokenUtil {
@@ -66,7 +67,7 @@ public class TokenUtil {
     */
     public String getToken(HttpServletRequest request) {
        String authorization = request.getHeader("Authorization");
-       String token = org.springframework.util.StringUtils.hasText(authorization) ? authorization.replaceFirst("Bearer ", "") : null;
+       String token = StringUtils.hasText(authorization) ? authorization.replaceFirst("Bearer ", "") : null;
        return token;
     }
 

+ 44 - 0
src/main/java/com/backendsys/modules/common/interceptor/ApiLogInterceptor.java

@@ -0,0 +1,44 @@
+package com.backendsys.modules.common.interceptor;
+
+import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+/**
+ * [拦截器] API日志
+ */
+@Component
+public class ApiLogInterceptor implements HandlerInterceptor {
+
+    @Autowired
+    private HttpRequestUtil httpRequestUtil;
+    private static final ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        // 记录请求时间
+        startTimeThreadLocal.set(System.currentTimeMillis());
+        return true;
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
+
+        // 记录用户ID (如果有的话)
+        String userIdLog = "";
+        Long user_id = httpRequestUtil.getUserId();
+        if (user_id != null) userIdLog = "(user_id: " + user_id + ") ";
+
+        // 请求处理时间
+        long consumeTime = System.currentTimeMillis() - startTimeThreadLocal.get();
+
+        System.out.println(
+                response.getStatus() + " [" + request.getMethod() + "] " +
+                request.getRequestURI() + " (IP: " + httpRequestUtil.getIpAddr() + ") " + userIdLog +
+                "Processing Time: " + consumeTime + " ms"
+        );
+    }
+}

+ 1 - 1
src/main/java/com/backendsys/modules/system/service/impl/SysAuthV2ServiceImpl.java

@@ -146,7 +146,7 @@ public class SysAuthV2ServiceImpl implements SysAuthV2Service {
 
         // 生成 Token
         SecurityUserInfo securityUserInfo = JSONUtil.toBean(JSONUtil.parseObj(sysUserInfo), SecurityUserInfo.class);
-        String token = jwtUtil.createJwtToken(securityUserInfo);
+        String token = jwtUtil.createSystemJwtToken(securityUserInfo);
         String tokenRedisKey = "token:id:" + uuid;
         redisUtil.setCacheObject(tokenRedisKey, token, tokenDuration, TimeUnit.MILLISECONDS);
         sysUserInfo.setToken(token);

+ 1 - 1
src/main/java/com/backendsys/service/System/SysAuthServiceImpl.java

@@ -189,7 +189,7 @@ public class SysAuthServiceImpl implements SysAuthService {
 //        String token = jwtUtil.createSystemToken(userInfo);
 
         SecurityUserInfo securityUserInfo = JSONUtil.toBean(JSONUtil.parseObj(sysUserDetail), SecurityUserInfo.class);
-        String token = jwtUtil.createJwtToken(securityUserInfo);
+        String token = jwtUtil.createSystemJwtToken(securityUserInfo);
 
         // 存入 Redis:Token、Token过期时间
         String tokenRedisKey = "token:id:" + uuid;

+ 3 - 0
src/main/resources/application-local.yml

@@ -11,6 +11,9 @@ HTTP_BASE_URI: http://127.0.0.1:48080
 HTTP_BASE_STATIC: http://127.0.0.1:48080
 HTTP_ACTUATOR_URI: https://jsonplaceholder.typicode.com
 
+# 是否开启API日志 (true|false)
+API_LOG: true
+
 log-stream:
   enable: true
   sign: 97e3ef8e-a8b9-46f3-b63a-f0504154efb7

+ 3 - 0
src/main/resources/application-prod.yml

@@ -11,6 +11,9 @@ HTTP_BASE_URI: http://43.128.1.201:48080
 HTTP_BASE_STATIC: http://ai.api.daoguyujia.com
 HTTP_ACTUATOR_URI: http://43.128.1.201:48080
 
+# 是否开启API日志 (true|false)
+API_LOG: false
+
 log-stream:
   enable: true
   sign: 97e3ef8e-a8b9-46f3-b63a-f0504154efb7