导语:线上项目突然炸了!前端报400/500,日志刷满红框——这是不是你凌晨排错的常态?本文把HTTP核心报错按“客户端/服务端”拆分,结合5年Java实战经验,讲透每类报错的“通用坑点+Java特有原因+解决方案”,最后附速查表格,收藏这篇,下次排错不用再翻官方文档!目录
- 一、先搞懂:HTTP报错的“核心逻辑”
- 二、4xx客户端错误:先查前端,再核Java接口配置
- 1. 400 Bad Request:请求格式“乱码”
- 2. 401 Unauthorized:没登录/登录失效
- 3. 403 Forbidden:登录了,但没权限
- 4. 404 Not Found:路径“查无此接口”
- 5. 413 Payload Too Large:文件/请求体太大
- 6. 402 Payment Required:需付费才能访问
- 三、5xx服务端错误:Java代码/配置/资源全排查
- 1. 500 Internal Server Error:服务器“崩了”
- 2. 502 Bad Gateway:网关收到无效响应
- 3. 503 Service Unavailable:服务“忙不过来”
- 4. 504 Gateway Timeout:网关“等不及”了
- 四、Java项目HTTP报错速查手册(收藏版)
- 五、最后:排错的“黄金思维”
一、先搞懂:HTTP报错的“核心逻辑”
HTTP状态码分5大类,但真正让我们熬夜排错的,99%集中在4xx(客户端错)和5xx(服务端错)。记住这个核心原则:
4xx:前端/客户端的请求“不合规”,服务器根本没法处理(比如路径写错、参数传错)
5xx:请求格式没问题,但服务器“自己掉链子”(比如代码空指针、数据库崩了)
下面逐个拆解高频报错,每个都附Java项目实战案例——都是我踩过的坑,你别再踩!
二、4xx客户端错误:先查前端,再核Java接口配置
这类错误别上来就扒Java代码!先让前端把“请求地址、参数、请求头”丢给你,对照下面的场景排查。
1. 400 Bad Request:请求格式“乱码”
通用坑点:请求参数缺失、格式错误,服务器解析失败
Java项目典型场景:
场景1:JSON传参格式错,日志报
com.fasterxml.jackson.databind.JsonMappingException——前端把“age”传成字符串“十八”,但Java实体类里age是int类型场景2:
@Valid参数校验失败——比如用户注册接口,手机号字段没传,触发MethodArgumentNotValidException场景3:Tomcat参数超限——POST请求参数太长,超过Tomcat默认的
maxPostSize配置
Java端解决方案:
- 用
@NotBlank、@Pattern做参数校验,全局异常捕获返回友好提示
- 用
- Spring Boot配置Tomcat参数(application.yml):
server:tomcat:max-http-post-size:-1# -1表示不限制POST参数大小max-swallow-size:-12. 401 Unauthorized:没登录/登录失效
通用坑点:缺少认证信息,或认证令牌无效
Java项目典型场景:
场景1:JWT令牌过期,日志报
io.jsonwebtoken.ExpiredJwtException——用户长时间没操作,令牌超时场景2:请求头没带Authorization——前端忘了在Header里加“Bearer 令牌”
场景3:Spring Security配置错——认证过滤器顺序不对,令牌还没解析就被拦截
解决方案:
- 全局捕获JWT异常,返回“令牌过期,请重新登录”
- 前端做令牌过期拦截,自动刷新令牌
- 检查Spring Security配置,确保认证过滤器在权限过滤器之前:
@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{http.addFilterBefore(jwtAuthFilter,UsernamePasswordAuthenticationFilter.class).authorizeRequests().anyRequest().authenticated();}3. 403 Forbidden:登录了,但没权限
通用坑点:已认证,但权限不足访问资源
Java项目典型场景:
场景1:Spring Security角色不匹配——接口要求
hasRole("ADMIN"),但用户只有USER角色场景2:跨域配置没放行——前端跨域请求,OPTIONS预请求被拦截
场景3:自定义权限拦截器拒绝——比如用户只能操作自己的订单,却传了别人的订单ID
解决方案:
// 1. 权限配置细化到接口.antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasRole("USER")// 2. 跨域配置放行OPTIONS请求@ConfigurationpublicclassCorsConfig{@BeanpublicCorsFiltercorsFilter(){CorsConfigurationconfig=newCorsConfiguration();config.addAllowedMethod("*");// 放行所有请求方法// 其他配置...}}4. 404 Not Found:路径“查无此接口”
Java项目高频原因:
- Controller映射路径错——比如
@GetMapping("/user"),前端请求/users(多了个s)
- Controller映射路径错——比如
- 静态资源路径错——JS/CSS放在
classpath:static/下,但请求路径写了/static/js/index.js(多了/static)
- 静态资源路径错——JS/CSS放在
- 上下文路径配置错——Tomcat配置了Context Path为“/api”,但请求没加“/api”前缀
5. 413 Payload Too Large:文件/请求体太大
Java项目典型场景:文件上传时,单个文件超过配置限制
解决方案:Spring Boot配置文件上传参数:
spring: servlet: multipart: max-file-size: 100MB # 单个文件最大100MB max-request-size: 200MB # 一次请求总文件大小最大200MB6. 402 Payment Required:需付费才能访问
通用坑点:标准状态码定义为“请求需付费”,但未被广泛标准化,不同服务有自定义含义
Java项目典型场景:
场景1:付费接口未开通——如调用第三方API(短信/支付)时,账号余额不足,第三方返回402
场景2:自定义权限控制——内部系统中,普通用户访问VIP功能,后端拦截返回402
解决方案:
- 对接第三方时,捕获402异常并提示“服务需付费开通,请联系管理员”
- 自定义拦截器中明确返回付费提示,避免与403权限错误混淆:
// 自定义付费拦截器示例 public class PaymentInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!isVipUser(request)) { response.setStatus(402); response.getWriter().write("该功能为VIP专属,请升级权限"); return false; } return true; } }三、5xx服务端错误:Java代码/配置/资源全排查
这类错误是后端的“锅”,重点看Java日志的Caused by,定位核心异常。
1. 500 Internal Server Error:服务器“崩了”
Java项目第一杀手,90%是未捕获的运行时异常,比如:
场景1:空指针异常——
User user = userMapper.selectById(id);返回null,直接调用user.getName()场景2:数据库异常——SQL语法错、连接超时,报
SQLException场景3:内存溢出——
OutOfMemoryError,JVM堆内存不足
排错技巧:
- 全局异常处理器捕获所有异常,打印完整堆栈:
@RestControllerAdvicepublicclassGlobalExceptionHandler{@ExceptionHandler(Exception.class)publicResultVOhandleException(Exceptione){log.error("系统异常",e);// 关键:打印完整堆栈returnResultVO.error("系统繁忙,请稍后再试");}}- 空指针用
Optional规避:Optional.ofNullable(user).map(User::getName).orElse("默认名称")
- 空指针用
- 内存溢出:用
jmap命令导出堆快照,用MAT工具分析
- 内存溢出:用
2. 502 Bad Gateway:网关收到无效响应
通用坑点:网关/代理服务器从上游服务器收到无效响应(如后端服务崩溃、连接中断)
Java项目典型场景:
场景1:Nginx反向代理异常——后端Tomcat服务宕机,Nginx转发请求后收不到正常响应
场景2:微服务网关通信失败——Spring Cloud Gateway/Zuul调用服务节点时,节点突然下线
场景3:服务间通信协议错——Feign调用时,目标服务返回非JSON格式数据,解析失败
解决方案:
- 检查后端服务状态:用
ps -ef | grep java查看服务进程,重启崩溃的服务
- 检查后端服务状态:用
- Nginx配置健康检查,自动跳过故障节点:
// Nginx健康检查配置 upstream backend { server 127.0.0.1:8080; server 127.0.0.1:8081; check interval=3000 rise=2 fall=3 timeout=1000; // 每3秒检查,2次成功算正常,3次失败剔除 } location /api/ { proxy_pass http://backend; }- 微服务网关配置超时与降级:
// Spring Cloud Gateway超时配置 spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/user/** filters: - name: RequestRateLimiter - name: Hystrix args: name: fallbackCmd fallbackUri: forward:/fallback // 502时触发降级 - name: RequestTimeout args: connectTimeout: 1000 responseTimeout: 30003. 503 Service Unavailable:服务“忙不过来”
Java项目典型场景:
场景1:服务熔断——Sentinel/Hystrix触发熔断,拒绝新请求
场景2:数据库连接池耗尽——
Could not get JDBC Connection,连接池满了场景3:服务器CPU/内存100%——代码有死循环,或并发量突增
解决方案:
# 1. 数据库连接池配置优化(HikariCP)spring:datasource:hikari:maximum-pool-size:20# 最大连接数,根据CPU核数配置minimum-idle:5connection-timeout:30000# 连接超时时间- 检查Sentinel配置,是否把阈值设得太低
- 用
top命令查看CPU占用,定位高耗资源的线程
- 用
4. 504 Gateway Timeout:网关“等不及”了
微服务项目高频坑:网关转发请求后,后端服务响应超时
Java项目原因:
- 数据库查询慢——复杂SQL没加索引,执行时间超过5秒
- 第三方接口超时——Feign调用第三方接口,没配置超时时间
- Nginx网关配置的
proxy_read_timeout过短(默认60秒)
- Nginx网关配置的
解决方案:
// 1. Feign超时配置@FeignClient(name="user-service")publicinterfaceUserFeignClient{@GetMapping("/user/{id}")@Timeout(3000)// 超时3秒UsergetUserById(@PathVariable("id")Longid);}// 2. Nginx配置优化 location /api/ { proxy_pass http://backend; proxy_read_timeout 120s; // 延长读取超时时间 }四、Java项目HTTP报错速查手册(收藏版)
| 状态码 | 核心原因 | Java端排错重点 |
|---|---|---|
| 400 | 参数/格式错误 | JSON解析异常、@Valid校验失败、Tomcat参数超限(如maxParameterCount)、请求参数类型不匹配 |
| 401 | 未认证/令牌错误 | JWT过期/签名错误、Spring Security认证过滤器配置、Token解析异常、用户态未正确传递 |
| 402 | 需要付款(预留) | 一般无实际排错场景,若出现需检查网关/第三方拦截器是否误配置付费校验逻辑 |
| 403 | 权限不足 | 角色/权限不匹配、跨域配置未放行(CORS)、自定义权限拦截器逻辑、IP白名单限制 |
| 404 | 路径/资源不存在 | Controller映射注解(@RequestMapping)路径错误、静态资源路径配置、上下文路径(context-path)不匹配、Feign调用服务名/路径错误 |
| 405 | 方法不允许 | @GetMapping/@PostMapping等注解与请求HTTP方法(GET/POST/PUT/DELETE)不匹配、@RequestMapping(method)配置错误、跨域未放行对应HTTP方法 |
| 406 | 不可接受 | ContentNegotiation配置错误、客户端Accept头指定的格式(如XML)服务端无法返回、MessageConverter(Jackson/Gson)未配置对应类型解析 |
| 407 | 代理认证要求 | 代理服务器(Nginx/Zuul)认证参数配置错误、JVM代理参数(-Dhttp.proxyUser)缺失、Feign/RestTemplate代理认证未配置 |
| 408 | 请求超时 | Tomcat/Undertow的connectionTimeout配置、网关(Gateway/Nginx)请求读取超时、客户端请求数据发送过慢 |
| 409 | 资源冲突 | 乐观锁版本号冲突、数据库唯一索引重复插入、分布式锁未释放、接口幂等性处理失效(如重复提交) |
| 410 | 资源永久移除 | 接口/静态资源已下线仍被调用、数据库数据物理删除未做兼容返回、CDN缓存资源已清理 |
| 411 | 需要内容长度 | Tomcat要求必须传递Content-Length头、客户端请求头缺失Content-Length配置、流式请求未适配chunked编码 |
| 412 | 前置条件失败 | 请求头If-Match/If-Modified-Since校验失败、缓存/资源版本校验逻辑异常、乐观锁前置条件不满足 |
| 413 | 请求体/文件过大 | Spring Boot multipart配置(max-file-size/max-request-size)、Tomcat maxPostSize参数、Nginx client_max_body_size限制 |
| 500 | 代码/运行时异常 | 空指针(NPE)、SQL异常(如语法错误/连接失败)、内存溢出(OOM)、完整堆栈日志定位异常代码行 |
| 501 | 未实现 | 接口抽象方法未重写、第三方SDK方法未支持、网关转发到未实现的后端接口、自定义处理器未实现核心逻辑 |
| 502 | 网关错误 | 后端服务宕机/端口不通、网关(Nginx/Spring Cloud Gateway)配置错误、后端返回非法响应格式(如非标准JSON) |
| 503 | 服务不可用 | 熔断(Sentinel/Hystrix)触发、数据库/Redis连接池耗尽、CPU/内存过载导致服务无法响应 |
| 504 | 响应超时 | 慢SQL(未加索引)、Feign/RestTemplate超时配置过短、网关(Nginx/Gateway)upstream超时、分布式调用链路过长 |
五、最后:排错的“黄金思维”
- 4xx先查请求:让前端抓包,看请求地址、参数、头是否和接口文档一致;
2.5xx先看日志:重点盯Caused by后的异常,90%的问题都在这;
3.高频报错做监控:用Prometheus+Grafana监控409(冲突)、503(熔断),提前预警;
- 异常信息要友好:别给用户返回“500 Internal Server Error”,要转成“系统繁忙,请稍后再试”,同时日志打印完整堆栈。