当前位置:首页 > 后端开发 > 正文

Java如何捕获404异常?

在Java Web开发中捕获404异常,可通过以下方式实现:,1. 使用Spring框架时,通过 @ControllerAdvice配合 @ExceptionHandler(NoHandlerFoundException.class)全局处理。,2. 在Servlet应用中配置web.xml的“标签指定404错误处理器。,3. 通过过滤器或拦截器检查响应状态码,对HttpServletResponse.SC_NOT_FOUND(404)进行拦截处理。

在Java Web应用中,404状态码表示客户端请求的资源不存在,作为开发者,捕获并优雅处理404异常能提升用户体验和系统可维护性,以下是几种主流实现方案:

Spring MVC 全局异常处理(推荐)

通过@ControllerAdvice@ExceptionHandler实现:

@ControllerAdvice
public class GlobalExceptionHandler {
    // 捕获NoHandlerFoundException(需配合配置启用)
    @ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity<Object> handle404(NoHandlerFoundException ex) {
        Map<String, Object> body = new LinkedHashMap<>();
        body.put("timestamp", LocalDateTime.now());
        body.put("message", "资源不存在");
        return new ResponseEntity<>(body, HttpStatus.NOT_FOUND);
    }
}

关键配置(在application.properties中):

Java如何捕获404异常?  第1张

spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false

Servlet容器级错误页面(传统Web项目)

web.xml中定义错误页面:

<error-page>
    <error-code>404</error-code>
    <location>/error/404.html</location>
</error-page>

创建对应的HTML文件:

<!-- /WEB-INF/views/error/404.html -->
<h1>404 错误</h1>
<p>您访问的页面不存在</p>

Spring Boot自定义ErrorController

实现ErrorController接口处理所有错误:

@RestController
public class CustomErrorController implements ErrorController {
    @RequestMapping("/error")
    public ResponseEntity<Map<String, Object>> handleError(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == 404) {
            return ResponseEntity.status(404)
                .body(Map.of("error", "Not Found", "path", request.getRequestURI()));
        }
        return ResponseEntity.status(500).body(Map.of("error", "Server Error"));
    }
}

前端控制器兜底方案

在DispatcherServlet中配置默认处理器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/**")
                .setStatusCode(HttpStatus.NOT_FOUND)
                .setViewName("forward:/error/404");
    }
}

最佳实践建议

  1. 优先级选择
    • Spring Boot项目优先使用@ControllerAdvice
    • 纯Servlet项目用web.xml配置
  2. 日志记录:在处理器中添加日志记录404请求路径
  3. 友好响应
    • REST API返回JSON格式错误信息
    • 网页应用返回定制化HTML页面
  4. 重定向处理:避免将404重定向到首页(可能导致SEO问题)

注意事项

  • Tomcat默认跳过小于400字节的404响应(可通过server.error.whitelabel.enabled=false关闭默认白页)
  • 确保静态资源路径配置正确,避免误报404

引用说明
本文解决方案参考Oracle官方Servlet规范文档、Spring Framework 5.3.x异常处理文档及Spring Boot 2.7.x错误处理机制,关键配置项依据Spring官方GitHub示例代码验证。

0