定义各种字段/class结构/序列化/反序列化
This commit is contained in:
commit
6fa8521dd5
38
.gitignore
vendored
Normal file
38
.gitignore
vendored
Normal file
@ -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
|
5
.idea/.gitignore
generated
vendored
Normal file
5
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Environment-dependent path to Maven home directory
|
||||
/mavenHomeManager.xml
|
7
.idea/encodings.xml
generated
Normal file
7
.idea/encodings.xml
generated
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
14
.idea/misc.xml
generated
Normal file
14
.idea/misc.xml
generated
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="ms-21" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
62
pom.xml
Normal file
62
pom.xml
Normal file
@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>cn.zhangdeman</groupId>
|
||||
<artifactId>common-filter</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<version>6.1.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.30</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
<version>6.1.14</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>2.0.17</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<version>1.7.30</version>
|
||||
</dependency>
|
||||
<!-- jackson 2.x 相关依赖 -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-core</artifactId>
|
||||
<version>2.19.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.19.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
<version>2.19.0</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
9
src/main/java/cn/zhangdeman/HttpField.java
Normal file
9
src/main/java/cn/zhangdeman/HttpField.java
Normal file
@ -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
|
||||
}
|
62
src/main/java/cn/zhangdeman/InitRequestData.java
Normal file
62
src/main/java/cn/zhangdeman/InitRequestData.java
Normal file
@ -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<String, Object> 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<InitRequestData>() {
|
||||
});
|
||||
}
|
||||
}
|
22
src/main/java/cn/zhangdeman/LogField.java
Normal file
22
src/main/java/cn/zhangdeman/LogField.java
Normal file
@ -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"; // 消息队列日志
|
||||
}
|
9
src/main/java/cn/zhangdeman/Main.java
Normal file
9
src/main/java/cn/zhangdeman/Main.java
Normal file
@ -0,0 +1,9 @@
|
||||
package cn.zhangdeman;
|
||||
|
||||
//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
|
||||
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
|
||||
}
|
||||
}
|
5
src/main/java/cn/zhangdeman/Ordered.java
Normal file
5
src/main/java/cn/zhangdeman/Ordered.java
Normal file
@ -0,0 +1,5 @@
|
||||
package cn.zhangdeman;
|
||||
|
||||
public class Ordered {
|
||||
public static final int REQUEST_ID = -10000; // 请求ID生成过滤器
|
||||
}
|
17
src/main/java/cn/zhangdeman/RecordField.java
Normal file
17
src/main/java/cn/zhangdeman/RecordField.java
Normal file
@ -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"; // 请求客户端
|
||||
}
|
38
src/main/java/cn/zhangdeman/RequestInitFilter.java
Normal file
38
src/main/java/cn/zhangdeman/RequestInitFilter.java
Normal file
@ -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() {
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user