Tomcat源码分析之 doGet方法(四)


声明:本文转载自https://my.oschina.net/gschen/blog/1624063,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客。

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 源码的角度为大家分析了原因。

下一讲我们将分析 StandardHostValve 组件。

欲知后事如何,请持续关注“算法与编程之美”微信公众号,及时了解更多精彩文章。

本文发表于2018年02月26日 18:39
(c)注:本文转载自https://my.oschina.net/gschen/blog/1624063,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1750 讨论 0 喜欢 1

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1