如何在Spring Boot中记录未知URL端点的请求?
实现Spring Boot未知URL端点请求记录的方案
嘿,这个需求我之前也遇到过,刚好可以给你几个实用的方案,完美适配你这种用URL参数区分端点的Spring Boot应用(包括用SpringBootServletInitializer打包成WAR的场景):
方案一:全局异常处理器(精准捕捉无匹配处理器的请求)
这种方式会专门捕捉Spring MVC找不到合适处理器的情况,包括路径完全不存在、路径存在但参数不匹配、请求方法不匹配等场景。
步骤1:配置application.properties
首先需要开启抛出无处理器异常的配置,否则参数不匹配的情况只会默默返回404,不会触发异常捕捉:
# 开启无处理器时抛出异常 spring.mvc.throw-exception-if-no-handler-found=true # 关闭静态资源自动映射(避免静态资源的404被记录,若有静态资源需求可调整) spring.web.resources.add-mappings=false
步骤2:实现全局异常处理器
创建一个全局异常处理类,捕捉NoHandlerFoundException并记录请求详情:
import jakarta.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.NoHandlerFoundException; @RestControllerAdvice public class UnknownRequestLogger { private static final Logger logger = LoggerFactory.getLogger(UnknownRequestLogger.class); @ExceptionHandler(NoHandlerFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public void logUnknownRequest(NoHandlerFoundException ex, HttpServletRequest request) { // 记录请求的关键信息:请求方法、路径、参数、客户端IP String requestDetails = String.format( "⚠️ 未知端点请求:方法=%s,路径=%s,参数=%s,客户端IP=%s", request.getMethod(), request.getRequestURI(), request.getQueryString(), request.getRemoteAddr() ); logger.warn(requestDetails); // 如果需要返回自定义响应,可以在这里返回一个DTO对象,比如return new ErrorResponse("未知端点"); } }
方案二:Filter过滤器(捕捉所有404响应)
如果你想记录所有返回404状态码的请求(包括静态资源的404,若有需要),可以用Filter的方式,在请求处理完成后检查响应状态:
import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.io.IOException; @Component public class NotFoundRequestLoggingFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(NotFoundRequestLoggingFilter.class); @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; // 先让请求正常处理 filterChain.doFilter(request, response); // 检查响应状态是否为404 if (response.getStatus() == HttpServletResponse.SC_NOT_FOUND) { String requestDetails = String.format( "⚠️ 404请求记录:方法=%s,路径=%s,参数=%s,客户端IP=%s", request.getMethod(), request.getRequestURI(), request.getQueryString(), request.getRemoteAddr() ); logger.warn(requestDetails); } } }
两种方案的选择建议
- 如果你只想记录业务接口的未知请求(排除静态资源),优先选方案一,精准度更高;
- 如果需要记录所有404请求(包括静态资源、未配置的路径等),可以选方案二,如果要排除静态资源,可在Filter里添加路径判断逻辑。
内容的提问来源于stack exchange,提问作者mal
相关产品推荐
相关产品推荐

