一次Tomcat返回404的分析

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 一个Web应用部署在阿里云EDAS上,使用Tomcat 7.0.59.3,在测试环境遭遇所有接口返回404的问题,而生产环境正常。测试与生产环境主要差异在于Apollo配置不同。通过Arthas工具监控,确认Spring已正确加载Controller,并且请求未进入Spring或Filter处理流程。进一步分析发现,Tomcat内部处理流程中设置了404状态码,最终定位到`org.apache.coyote.http11.AbstractHttp11Processor.process`方法存在问题。通过对代码逻辑的分析,确定原因是请求URL路径不正确。修正URL路径后问题得到解决。

问题描述

项目组有个web应用,部署在阿里云EDAS上,Tomcat版本是7.0.59.3。

项目组反馈在测试环境该工程所有接口都返回404,生产环境接口都能够正常访问。

测试环境与生产环境除了apollo上的配置不一样,其他都一样。报错信息如下:

问题分析

一、Controller类是否正确

首先想到的是Controller可能写法有问题,导致Spring没有加载到。通过arthas vmtool可以验证这个问题,如图2:

vmtool --action getInstances --className org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping --express 'instances[0].mappingRegistry.urlLookup' -x 1

从图2中可以看到Spring已经正确加载了Controller类。

二、Spring处理请求流程

是否是Spring在处理请求过程中,出现了问题导致返回的404?通过arthas watch可以验证这个问题,如图3:

watch org.springframework.web.servlet.FrameworkServlet service "{params[0].request.coyoteRequest}" -x 2

从图3中可以看到请求根本没有到达Spring处理流程中。

难道是Filter处理过程中出现了问题?通过arthas watch观察相关Filter类,发现请求也没有道道Filter的处理流程中。

三、Tomcat处理流程

请求没有到达Filter,可能在Tomcat处理的过程中出现了问题。

既然Tomcat 返回的是404,那么我们可以分析一下404是在哪个类中设置的,通过分析相关代码,设置状态码的方法如下:

/** 
 * Set the response status 
 */ 
public void setStatus( int status ) {
    this.status = status;
}

接口通过arthas watch看一下我们的判断是否正确,如图4:

watch org.apache.coyote.Response setStatus "{params}" -x 2

从图4可知,状态码是通过org.apache.coyote.Response.setStatus设置的。

接着通过arthas stack看一下该方法的线程栈就可以请求整个处理流程了,如图5:

stack org.apache.coyote.Response setStatus

org.apache.coyote.http11.AbstractHttp11Processor.process

由于tomcat是alitomcat,没有源码,所以通过反编译进行分析。

org.apache.catalina.connector.CoyoteAdapter

接下来看一下postParseRequest方法相关逻辑,如下:

分析到这里,已经找到了问题的根因,所以解决办法就是把url中的路径写正确。

参考资料

为什么请求总是404?

禹迹
+关注
目录
打赏
0
0
1
0
39
分享
相关文章
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
245 0
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
308 1
java tomcat服务无缘无故挂掉分析和解决方案
最近有同事反应有时候xxx系统有时候会时不时出现服务异常提示,一上机器,发现xxx服务进程不在,重启服务后又恢复了,所以这边就需要去跟进问题。
3723 0
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
252 0
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
【SpringBoot技术专题】「Tomcat技术专区」用正确的姿势如何用外置tomcat配置及运行(Tomcat优化分析)
【SpringBoot技术专题】「Tomcat技术专区」用正确的姿势如何用外置tomcat配置及运行(Tomcat优化分析)
401 0
springboot项目打成war包放入tomcat中运行,原理分析
1.需要将pom.xml文件的packaging设置为war。 2.改成war包之后,就可以直接使用maven的命令将项目打成一个war包了。 3.将这个war包直接放入到tomcat中运行。 4.启
447 0

云原生

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问