You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:25:18