Merge branch 'develop' into feature/gitlab-webhook

# Conflicts:
#	src/main/java/com/onixbyte/deltaforceguide/config/AppConfig.java
This commit is contained in:
2026-05-28 15:20:05 +08:00
2 changed files with 52 additions and 0 deletions
@@ -1,5 +1,6 @@
package com.onixbyte.deltaforceguide.config; package com.onixbyte.deltaforceguide.config;
import com.onixbyte.deltaforceguide.interceptor.TrafficInterceptor;
import com.onixbyte.deltaforceguide.interceptor.GitLabWebhookInterceptor; import com.onixbyte.deltaforceguide.interceptor.GitLabWebhookInterceptor;
import com.onixbyte.deltaforceguide.properties.AppProperties; import com.onixbyte.deltaforceguide.properties.AppProperties;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -12,17 +13,22 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableConfigurationProperties(AppProperties.class) @EnableConfigurationProperties(AppProperties.class)
public class AppConfig implements WebMvcConfigurer { public class AppConfig implements WebMvcConfigurer {
private final TrafficInterceptor trafficInterceptor;
private final GitLabWebhookInterceptor gitLabWebhookInterceptor; private final GitLabWebhookInterceptor gitLabWebhookInterceptor;
@Autowired @Autowired
public AppConfig( public AppConfig(
TrafficInterceptor trafficInterceptor,
GitLabWebhookInterceptor gitLabWebhookInterceptor GitLabWebhookInterceptor gitLabWebhookInterceptor
) { ) {
this.trafficInterceptor = trafficInterceptor;
this.gitLabWebhookInterceptor = gitLabWebhookInterceptor; this.gitLabWebhookInterceptor = gitLabWebhookInterceptor;
} }
@Override @Override
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(trafficInterceptor);
registry.addInterceptor(gitLabWebhookInterceptor) registry.addInterceptor(gitLabWebhookInterceptor)
.addPathPatterns("/webhook/gitlab"); .addPathPatterns("/webhook/gitlab");
} }
@@ -0,0 +1,46 @@
package com.onixbyte.deltaforceguide.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.jspecify.annotations.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@Component
public class TrafficInterceptor implements HandlerInterceptor {
private static final Logger log = LoggerFactory.getLogger(TrafficInterceptor.class);
@Override
public boolean preHandle(
@NonNull HttpServletRequest request,
@NonNull HttpServletResponse response,
@NonNull Object handler
) {
var ip = resolveClientIp(request);
var method = request.getMethod();
var uri = request.getRequestURI();
var query = request.getQueryString();
var contentType = request.getContentType();
var contentLength = request.getContentLength();
var userAgent = request.getHeader("User-Agent");
log.info("Request method={}, uri={}, query={}, ip={}, content-type={}, content-length={}, user-agent={}",
method, uri, query, ip, contentType, contentLength, userAgent);
return true;
}
private String resolveClientIp(HttpServletRequest request) {
var xForwardedFor = request.getHeader("X-Forwarded-For");
if (xForwardedFor != null && !xForwardedFor.isBlank()) {
return xForwardedFor.split(",")[0].trim();
}
var xRealIp = request.getHeader("X-Real-IP");
if (xRealIp != null && !xRealIp.isBlank()) {
return xRealIp.trim();
}
return request.getRemoteAddr();
}
}