您好,登錄后才能下訂單哦!
如何分析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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。