如何分析WEB-INF目录,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
Tomcat做为一个Web Container,最大的功能就是解析部署的WEB应用并给用户响应。
常见的WEB应用,也称为WAR文件
其中WEB-INF这个目录比较特殊,做为WEB应用的安全目录存在。Servlet规范是对此也有要求:
A special directory exists within the application hierarchy named “WEB-INF”.
This directory contains all things related to the application that aren’t in the document root of the application.
即所有与应用相关的,但又不能放到根目录下的文件可以放在这里。
包含的内容大致有以下几类:
web.xml
对于servlet 3.0,支持其web-fragment.xml的声明。
classes目录,用于存放所有编译过的应用的class文件
lib目录,存放应用依赖的,第三方的jar文件。
对于WEB-INF目录的访问,规范中有如下约束
The Web application class loader must load classes from the WEB-INF/classes directory first, and then from library JARs in the WEB-INF/lib directory. Also, except
for the case where static resources are packaged in JAR files, any requests from the
client to access the resources in WEB-INF/ directory must be returned with a
SC_NOT_FOUND(404) response.
所以,所有从client端发起的,对WEB-INF目录的直接请求(direct access),都必须返回404。
这样一来,我们一些需要保护的文件,就可以放到WEB-INF目录下,而不用担心被直接访问到。例如前面文章中提到的Manager应用,其对用户的访问设置了BASIC的登录验证,而验证需要的角色名称,验证方式,都是定义在web.xml中。如果WEB-INF目录能够被Client直接读取,那就太不安全了。
但是,对于应用自身,存放在WEB-INF目录下的文件仍然是需要访问的。为此,ServletContext接口对外提供了两个方法,方便使用。
getResource
getResourceAsStream
两个方法都接收一个以/开头的String类型的参数,用于获取从WEB应用的根目录下的所有资源,也包含WEB-INF目录。
Now, show you the code.
在Tomcat中,对于WEB-INF的直接访问保护,是如何实现的,
在StandardContextValve这个类中,Valve是Tomcat中的一个组件,译过来叫阀,在一个Pipeline中可以使用多个不同类型的Valve,来实现对整个Pipeline的控制。这里的StandardContextValve,是StandardContext(代表常用的一个Web应用)默认配置的一个Valve,所以,对于应用的请求,都会流经这个阀,处理之后,再进行下面其它组件的处理,而StandardWrapper(代表Servlet)是Context的一个下级组件,所以会在ContextValue处理之后再处理,从而实现访问控制。
而上面提到的ServletContext这个接口,是对外提供的一系列方法,用于和Servlet容器进行交互。
例如其除了暴露出getResource的接口外,还提供获取绝对路径的接口
getRealPath。
简单总结为,WEB-INF目录并不是WEB应用根目录树的一部分,其目录下所有内容,对服务端可见,对Client端不可见。在服务端,可以通过ServletContext接口对外暴露的方法读取。
看完上述内容,你们掌握如何分析WEB-INF目录的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。