commit 6fa8521dd524fe72e06c82845d3f08a98ba4ab44 Author: 白茶清欢 Date: Wed Jun 4 16:03:17 2025 +0800 定义各种字段/class结构/序列化/反序列化 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..a0ccf77 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Environment-dependent path to Maven home directory +/mavenHomeManager.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d61b968 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..ea2594a --- /dev/null +++ b/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + cn.zhangdeman + common-filter + 0.0.1-SNAPSHOT + + + 21 + 21 + UTF-8 + + + + + jakarta.servlet + jakarta.servlet-api + 6.1.0 + provided + + + org.projectlombok + lombok + 1.18.30 + + + org.springframework + spring-context + 6.1.14 + + + org.slf4j + slf4j-api + 2.0.17 + + + org.slf4j + slf4j-log4j12 + 1.7.30 + + + + com.fasterxml.jackson.core + jackson-core + 2.19.0 + + + com.fasterxml.jackson.core + jackson-databind + 2.19.0 + + + com.fasterxml.jackson.core + jackson-annotations + 2.19.0 + + + + \ No newline at end of file diff --git a/src/main/java/cn/zhangdeman/HttpField.java b/src/main/java/cn/zhangdeman/HttpField.java new file mode 100644 index 0000000..217e66c --- /dev/null +++ b/src/main/java/cn/zhangdeman/HttpField.java @@ -0,0 +1,9 @@ +package cn.zhangdeman; + +// http 一些枚举key +public class HttpField { + private static final String HEADER_TRACE_ID = "X-Front-Trace-Id"; // 透传过来的trace id + private static final String HEADER_CLIENT_IP = "X-Client-Ip"; // 请求来源IP + private static final String HEADER_USER_AGENT = "User-Agent"; // 请求来源 ua + private static final String HEADER_AUTHORIZATION = "Authorization"; // 请求来源 authorization +} diff --git a/src/main/java/cn/zhangdeman/InitRequestData.java b/src/main/java/cn/zhangdeman/InitRequestData.java new file mode 100644 index 0000000..29d5b26 --- /dev/null +++ b/src/main/java/cn/zhangdeman/InitRequestData.java @@ -0,0 +1,62 @@ +package cn.zhangdeman; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Map; + +// 初始化的请求信息 +@Getter +@Setter +public class InitRequestData implements Serializable { + @JsonProperty(RecordField.REQUEST_ID) + private String requestId; // 本次请求request id + @JsonProperty(RecordField.COST) + private Long cost; // 请求耗时 + @JsonProperty(RecordField.SERVER_IP) + private String serverIp; // 服务器Ip + @JsonProperty(RecordField.SERVER_HOSTNAME) + private String serverHostname; // 服务器hostname + @JsonProperty(RecordField.REQUEST_UA) + private String userAgent; // 客户端ua + @JsonProperty(RecordField.REQUEST_CLIENT_IP) + private String clientIp; // 客户端IP + @JsonProperty(RecordField.FINISH_TIMESTAMP) + private Long finishTimeStamp; // 完成请求时间 + @JsonProperty(RecordField.TRACE_ID) + private String traceId; // 全局trace id + @JsonProperty(RecordField.START_TIMESTAMP) + private Long startTimeStamp; // 开始请求时间 + @JsonProperty(RecordField.CONTEXT_DATA) + private Map logData; // 本条日志的上下文信息 + @JsonProperty(RecordField.RESPONSE_DATA) + private Object responseData; // 响应数据 + + // 序列化 + @Override + public String toString() { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + // 序列化 + public String serializable() { + return toString(); + } + + // 反序列化 + public InitRequestData unserializable(String json) throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(json, new TypeReference() { + }); + } +} diff --git a/src/main/java/cn/zhangdeman/LogField.java b/src/main/java/cn/zhangdeman/LogField.java new file mode 100644 index 0000000..1cd9b93 --- /dev/null +++ b/src/main/java/cn/zhangdeman/LogField.java @@ -0,0 +1,22 @@ +package cn.zhangdeman; + +// 日志相关数据的枚举值 +public class LogField { + // 定义日志类型 + public static final String LOG_TYPE_ACCESS = "access"; // 服务请求记录 + public static final String LOG_TYPE_INPUT = "input"; // 请求输入信息 + public static final String LOG_TYPE_OUTPUT = "output"; // 请求输出信息 + public static final String LOG_TYPE_API = "api"; // 接口请求记录 + public static final String LOG_TYPE_MONITOR = "monitor"; // 系统监控 + public static final String LOG_TYPE_DATABASE = "database"; // 数据库 + public static final String LOG_TYPE_REDIS = "redis"; // redis日志 + public static final String LOG_TYPE_KAFKA = "kafka"; // kafka日志 + // 定义各种日志文件名称 + public static final String LOG_ACCESS_NAME = "access.log"; // 访问日志 + public static final String LOG_REQUEST_NAME = "request.log"; // 请求日志 + public static final String LOG_API_NAME = "api.log"; // 三方调用日志 + public static final String LOG_MONITOR_NAME = "monitor.log"; // 监控日志 + public static final String LOG_DATABASE_NAME = "database.log"; // 数据库日志 + public static final String LOG_CACHE_NAME = "cache.log"; // 缓存日志 + public static final String LOG_MESSAGE_NAME = "message.log"; // 消息队列日志 +} diff --git a/src/main/java/cn/zhangdeman/Main.java b/src/main/java/cn/zhangdeman/Main.java new file mode 100644 index 0000000..dd5663d --- /dev/null +++ b/src/main/java/cn/zhangdeman/Main.java @@ -0,0 +1,9 @@ +package cn.zhangdeman; + +//TIP To Run code, press or +// click the icon in the gutter. +public class Main { + public static void main(String[] args) { + + } +} \ No newline at end of file diff --git a/src/main/java/cn/zhangdeman/Ordered.java b/src/main/java/cn/zhangdeman/Ordered.java new file mode 100644 index 0000000..fc15560 --- /dev/null +++ b/src/main/java/cn/zhangdeman/Ordered.java @@ -0,0 +1,5 @@ +package cn.zhangdeman; + +public class Ordered { + public static final int REQUEST_ID = -10000; // 请求ID生成过滤器 +} diff --git a/src/main/java/cn/zhangdeman/RecordField.java b/src/main/java/cn/zhangdeman/RecordField.java new file mode 100644 index 0000000..bea7f30 --- /dev/null +++ b/src/main/java/cn/zhangdeman/RecordField.java @@ -0,0 +1,17 @@ +package cn.zhangdeman; + +// 记录的各种字段枚举值 +public class RecordField { + public static final String TRACE_ID = "trace_id"; // trace_id + public static final String REQUEST_ID = "request_id"; // request_id + public static final String START_TIMESTAMP = "start_timestamp"; // 开始请求时间 + public static final String FINISH_TIMESTAMP = "finish_timestamp"; // 完成请求时间 + public static final String SERVER_IP = "server_ip"; // 服务器IP + public static final String SERVER_HOSTNAME = "server_hostname"; // 服务器名称 + public static final String COST = "cost"; // 请求耗时 + public static final String CONTEXT_DATA = "context_data"; // 本条日志的上下文信息 + public static final String RESPONSE_DATA = "response_data"; // 接口响应数据 + // 请求信息 + public static final String REQUEST_UA = "request_user_agent"; // 请求ua + public static final String REQUEST_CLIENT_IP = "request_client"; // 请求客户端 +} diff --git a/src/main/java/cn/zhangdeman/RequestInitFilter.java b/src/main/java/cn/zhangdeman/RequestInitFilter.java new file mode 100644 index 0000000..ac61991 --- /dev/null +++ b/src/main/java/cn/zhangdeman/RequestInitFilter.java @@ -0,0 +1,38 @@ +package cn.zhangdeman; + + +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import org.springframework.core.annotation.Order; + +import java.io.IOException; + + +// 初始化请求 +@WebFilter("/*") // 所有接口请求均会触发次过滤器 +@Order(Ordered.REQUEST_ID) // 足够小, 保证最先执行 +public class RequestInitFilter implements Filter { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void destroy() { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + InitRequestData initRequestData = new InitRequestData(); + setBaseInfo(initRequestData); // 设置基础信息 + setRequestId(); // 设置请求ID, 每次请求军重新生成 + } + + // 设置基础信息 + private void setBaseInfo(InitRequestData initRequestData) { + initRequestData.setStartTimeStamp(System.currentTimeMillis()); // 开始请求时间 + } + + // 设置请求ID + private void setRequestId() { + } +}