1 目标
本次源码分析目标了解客户端请求在 StandardContextValve 中做了哪些工作
2 分析方法
根据第一讲的堆栈信息, 结合 Intellij Idea 的堆栈视图断点单步调试等手段分析源码
10. atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
3 分析流程
从上图我们可以看到, 客户端请求在到达过滤器之前, 会经历一系列的 Valve, 本讲我们重点分析 StandardContextValve
invoke() 方法主要做的工作有:
1) 检查请求路径的前缀是不是'/META-INF/','/web-INF/'开始, 或者请求就是上面'/META-INF', '/WEB-INF', 则禁止访问
- // Disallow any direct access to resources under WEB-INF orMETA-INF
- MessageBytesrequestPathMB = request.getRequestPathMB();
- if ((requestPathMB.startsWithIgnoreCase("/META-INF/", 0))
- ||(requestPathMB.equalsIgnoreCase("/META-INF"))
- ||(requestPathMB.startsWithIgnoreCase("/WEB-INF/", 0))
- ||(requestPathMB.equalsIgnoreCase("/WEB-INF"))) {
- response.sendError(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
2) 从 request 对象中获得 StandardWrapperValve, 并调用其 invoke() 方法, 开始进入到下一个 Valve 处理
- Wrapperwrapper = request.getWrapper();
- wrapper.getPipeline().getFirst().invoke(request, response);
4 总结
本讲重点了 StandardContextValve 组件, 当请求到达该组件时, 首先检查请求的路径信息, 禁止以'/META-INF/','/WEB-INF/'为前缀的一些请求, 从而保证服务器的安全, 其次获得下一个组件 StandardWrapperValve, 并调用其 invoke 方法
在刚开始学习 JavaWeb 的时候, 我们就知道 / WEB-INF / 文件夹的文件是不能够直接访问的, 禁止访问的以前我们只是知道这个知识点, 但是不明白为什么会这样本讲我们从 Tomcat 源码的角度为大家分析了原因
来源: http://mp.weixin.qq.com/s/z0MJHpltQ0rBK6kAFuBaIg