@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
中):
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"); } }
最佳实践建议
- 优先级选择:
- Spring Boot项目优先使用
@ControllerAdvice
- 纯Servlet项目用
web.xml
配置
- Spring Boot项目优先使用
- 日志记录:在处理器中添加日志记录404请求路径
- 友好响应:
- REST API返回JSON格式错误信息
- 网页应用返回定制化HTML页面
- 重定向处理:避免将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示例代码验证。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/35046.html