增加初始化Context相关定义

This commit is contained in:
白茶清欢 2025-06-05 17:31:14 +08:00
parent 7cf8d3a6c9
commit c05086852d
7 changed files with 130 additions and 25 deletions

44
.idea/misc.xml generated
View File

@ -8,6 +8,50 @@
</list>
</option>
</component>
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="org.jetbrains.annotations.Nullable" />
<option name="myDefaultNotNull" value="org.jetbrains.annotations.NotNull" />
<option name="myNullables">
<value>
<list size="14">
<item index="0" class="java.lang.String" itemvalue="org.jspecify.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
<item index="2" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
<item index="3" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
<item index="4" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
<item index="6" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
<item index="7" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="8" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
<item index="9" class="java.lang.String" itemvalue="jakarta.annotation.Nullable" />
<item index="10" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
<item index="11" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="12" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
<item index="13" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="14">
<item index="0" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
<item index="1" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
<item index="2" class="java.lang.String" itemvalue="org.jspecify.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="jakarta.annotation.Nonnull" />
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
<item index="5" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
<item index="6" class="java.lang.String" itemvalue="lombok.NonNull" />
<item index="7" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
<item index="8" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
<item index="9" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
<item index="11" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="12" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="13" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
</list>
</value>
</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>

View File

@ -1,7 +1,6 @@
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) {

View File

@ -10,7 +10,6 @@ public class RecordField {
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_INFO = "request_info"; // 请求信息
public static final String REQUEST_UA = "user_agent"; // 请求ua
@ -26,4 +25,13 @@ public class RecordField {
public static final String REQUEST_URI = "uri"; // 请求接口
public static final String RUNTIME_THREAD_CONTEXT = "runtime_thread_context"; // 运行时线程上下文
public static final String RESPONSE_INFO = "response_data"; // 接口响应数据
public static final String RESPONSE_CODE = "code"; // 接口响应数据状态码
public static final String RESPONSE_MESSAGE = "message"; // 接口响应数据状态码描述
public static final String RESPONSE_DATA = "data"; // 接口响应数据
public static final String RESPONSE_ERROR_DETAIL = "err_detail"; // 异常详细信息
public static final String RESPONSE_HTTP_CODE = "http_code"; // 苍蝇状态码,默认200
public static final String RESPONSE_HEADER = "header"; // 响应header
public static final String RESPONSE_COOKIE = "cookie"; // 响应header
}

View File

@ -6,7 +6,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.servlet.http.HttpServletRequest;
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;
import java.util.Map;
@ -14,7 +13,6 @@ import java.util.Map;
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知属性字段
@Component
public class Request {
@JsonIgnore
HttpServletRequest httpServletRequest;// 原始请求

View File

@ -0,0 +1,48 @@
package cn.zhangdeman;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.servlet.http.HttpServletResponse;
import lombok.Getter;
import lombok.Setter;
import java.util.HashMap;
import java.util.Map;
// 响应数据
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知属性字段
public class Response {
@JsonProperty(RecordField.RESPONSE_CODE)
private String code; // 响应业务状态码
@JsonProperty(RecordField.RESPONSE_MESSAGE)
private String message; // 响应消息
@JsonProperty(RecordField.RESPONSE_DATA)
private Object data; // 响应数据
@JsonProperty(RecordField.RESPONSE_ERROR_DETAIL)
private Object errorDetail; // 异常详情
@JsonProperty(RecordField.RESPONSE_HTTP_CODE)
private Integer httpCode = 200; // 响应http状态码
@JsonProperty(RecordField.RESPONSE_HEADER)
private Map<String, String> header; // 响应头
@JsonProperty(RecordField.RESPONSE_COOKIE)
private Map<String, String> cookie; // 响应cookie
@JsonIgnore
private HttpServletResponse httpServletResponse; // 响应实例
public void addHeader(String key, String value) {
if (null == this.header) {
this.header = new HashMap<>();
}
this.header.put(key, value);
}
public void addCookie(String key, String value) {
if (null == this.cookie) {
this.cookie = new HashMap<>();
}
this.cookie.put(key, value);
}
}

View File

@ -15,7 +15,7 @@ import java.util.Map;
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知属性字段
public class Context implements Serializable {
public class RuntimeContext implements Serializable {
@JsonProperty(RecordField.REQUEST_ID)
private String requestId; // 本次请求request id
@JsonProperty(RecordField.COST)
@ -36,6 +36,8 @@ public class Context implements Serializable {
private Object responseData; // 响应数据
@JsonProperty(RecordField.REQUEST_INFO)
private Request requestInfo;// 请求信息
@JsonProperty(RecordField.RESPONSE_INFO)
private Response responseInfo; // 响应信息
// 序列化
@Override
@ -54,9 +56,9 @@ public class Context implements Serializable {
}
// 反序列化
public Context unserializable(String json) throws JsonProcessingException {
public RuntimeContext unserializable(String json) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(json, new TypeReference<Context>() {
return mapper.readValue(json, new TypeReference<RuntimeContext>() {
});
}
}

View File

@ -1,10 +1,7 @@
package cn.zhangdeman.filter;
import cn.zhangdeman.Context;
import cn.zhangdeman.Ordered;
import cn.zhangdeman.RecordField;
import cn.zhangdeman.Request;
import cn.zhangdeman.*;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
@ -37,20 +34,20 @@ public class RequestInitFilter extends HttpFilter {
@Override
public void doFilter(HttpServletRequest httpServletRequest, HttpServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
Context context = new Context();
setBaseInfo(httpServletRequest, context); // 设置基础信息
setRequestQuery(context.getRequestInfo()); // 设置请求query信息
setRequestBody(context.getRequestInfo()); // 设置请求Body
setRequestHeaderAndCookie(context.getRequestInfo()); // 填充请求信息: header + cookie
setRequestId(context); // 设置请求ID, 每次请求需要重新生成
httpServletRequest.setAttribute(RecordField.RUNTIME_THREAD_CONTEXT, context); // 记录到请求上下文中
RuntimeContext runtimeContext = new RuntimeContext();
setBaseInfo(httpServletRequest, runtimeContext); // 设置基础信息
setRequestQuery(runtimeContext.getRequestInfo()); // 设置请求query信息
setRequestBody(runtimeContext.getRequestInfo()); // 设置请求Body
setRequestHeaderAndCookie(runtimeContext.getRequestInfo()); // 填充请求信息: header + cookie
setRequestId(runtimeContext); // 设置请求ID, 每次请求需要重新生成
httpServletRequest.setAttribute(RecordField.RUNTIME_THREAD_CONTEXT, runtimeContext); // 记录到请求上下文中
// 继续向后执行
filterChain.doFilter(httpServletRequest, servletResponse);
System.out.println("init request do filter 请求执行完成");
}
// 设置基础信息
private void setBaseInfo(HttpServletRequest httpServletRequest, Context context) {
private void setBaseInfo(HttpServletRequest httpServletRequest, RuntimeContext runtimeContext) {
// request 信息
Request request = new Request();
request.setHttpServletRequest(httpServletRequest);
@ -59,10 +56,15 @@ public class RequestInitFilter extends HttpFilter {
request.setRequestContentType(httpServletRequest.getContentType()); // 请求类型
request.setRequestUri(httpServletRequest.getRequestURI()); // 请求uri
// server 信息
context.setServerIp(httpServletRequest.getLocalAddr()); // 服务器IP
context.setServerHostname(httpServletRequest.getLocalName()); // 服务器名称
context.setRequestInfo(request); // 请求信息
context.setStartTimeStamp(System.currentTimeMillis()); // 开始请求时间
runtimeContext.setServerIp(httpServletRequest.getLocalAddr()); // 服务器IP
runtimeContext.setServerHostname(httpServletRequest.getLocalName()); // 服务器名称
runtimeContext.setRequestInfo(request); // 请求信息
runtimeContext.setStartTimeStamp(System.currentTimeMillis()); // 开始请求时间
// 响应信息
Response response = new Response();
response.setHeader(new HashMap<>());
response.setCookie(new HashMap<>());
runtimeContext.setResponseInfo(response); // 响应信息
}
// 设置请求Query
@ -117,6 +119,10 @@ public class RequestInitFilter extends HttpFilter {
}
// 设置请求ID
private void setRequestId(Context context) {
private void setRequestId(RuntimeContext runtimeContext) {
}
// 响应信息
private void setResponse(Response response) {
}
}