-
Notifications
You must be signed in to change notification settings - Fork 7.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Arthas实践--快速排查Spring Boot应用404/401问题 #429
Labels
Comments
stack -E javax.servlet.http.HttpServletResponse sendError|setStatus params[0]==404 |
有赞 |
感觉你把这个系列放在wiki更好一些 issue是提问题的地方..... |
wiki没有办法评论交流,issue打上tag,做为区分就可以了。 |
挺强大的工具 |
想知道小问题的答案是什么
难道是request和response都触发了一次 "trace javax.servlet.Servlet" ? |
浏览器访问网站时,会尝试获取网站图标,比如访问当前页面会有下面的请求: 所以会拦截到两次请求。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
背景
在Java Web/Spring Boot开发时,很常见的问题是:
碰到这种问题时,通常很头痛,特别是在线上环境时。
本文介绍使用Alibaba开源的Java诊断利器Arthas,来快速定位这类Web请求404/401问题。
Java Web里一个请求被处理的流程
在进入正题之前,先温习下知识。一个普通的Java Web请求处理流程大概是这样子的:
Demo
本文的介绍基于一个很简单的Demo:https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-404-401
是哪个Servlet返回了404?
Demo启动后,访问:http://localhost:8080/a.txt ,返回404:
我们知道一个HTTP Request,大部分情况下都是由一个Servlet处理的,那么到底是哪个Servlet返回了404?
我们使用Arthas的
trace
命令来定位:然后访问 http://localhost:8080/a.txt ,Arthas会打印出整个请求树,完整的输出太长,这里只截取关键的一输出:
可以看出请求经过Spring MVC的
DispatcherServlet
处理,最终由ViewResolver
分派给FreeMarkerView$GenericServletAdapter
处理。所以我们可以知道这个请求最终是被FreeMarker
处理的。后面再排查
FreeMarker
的配置就可以了。这个神奇的
trace javax.servlet.Servlet *
到底是怎样工作的呢?实际上Arthas会匹配到JVM里所有实现了
javax.servlet.Servlet
的类,然后trace
它们的所有函数,所以HTTP请求会被打印出来。是哪个Filter返回了401?
在Demo里,访问 http://localhost:8080/admin ,会返回401,即没有权限。那么是哪个Filter拦截了请求?
我们还是使用Arthas的
trace
命令来定位,不过这次trace
的是javax.servlet.Filter
:再次访问admin,在Arthas里,把整个请求经过哪些Filter处理,都打印为树。这里截取关键部分:
可以看到HTTP Request最终是被
com.example.demo404401.AdminFilterConfig$AdminFilter
处理的。总结
链接
打个广告,Arthas正在征集使用者,您的使用是对我们最大的支持。
如果Arthas对您排查问题有帮助,请到这个Issue登记下,并在30分钟内成为Arthas Contributor:
#395
The text was updated successfully, but these errors were encountered: