對Java Web中WEB-INF目錄的理解以及訪問方法

Zxeao發表於2022-11-25

事情發生

在上個暑假第一次寫Java web大專案的時候,對於目錄管理及分配沒有任何經驗,就想著清晰明瞭。
後端servlet是用maven進行構建的,所以在目錄上沒有碰到什麼大問題。
用idea進行Java Web專案構建的時候,會自動生成這樣一個前端目錄
image
當時對攔截器以及安全目錄什麼的完全沒有概念,於是就把頁面,還有css和js以及resource全部放進WEB-INF。
於是乎災難來了嗎,最直觀的體現就是,css樣式不生效,怎樣都不生效,因為沒有安全目錄以及攔截器概念,完全找不到解決方法,這個bug真的是找的天昏地暗。

問題原因

原來WEB-INF是安全目錄。
WEB-INF下面的內容只能由伺服器級別才能訪問,客戶端並不能訪問。

伺服器級別指:經過伺服器內的Controller渲染。
客戶端級別指:透過瀏覽器直接訪問。

所以作為安全目錄,將jsp檔案放到裡面是對的,避免客戶端直接訪問,保證了安全性。
使用者想要訪問就要訪問伺服器的Controller,經過它的渲染,才能呈現檔案,這就是為什麼index.jsp不在WEB-INF目錄下的原因。

因為我把css和js以及資原始檔放在了WEB-INF目錄底下,頁面自然訪問不到安全目錄,自然css不生效。

問題解決

頁面可以放在它下面可以用Contriller渲染然後進行訪問,但是其他資源不可以呀。
把css等靜態檔案放在WEB-INF目錄外面。就可以解決無法訪問以至於css樣式不生效等問題。

但是

我當時不知道呀,不知道還有安全目錄一說,不會把他們放在外面,但是問題不能不解決。
爬了半天的搜尋引擎,看遍了各種部落格以及分享,試了各種方式之後。
從鋪天蓋地的資訊中看出來了兩個字:

路徑,要讀取WEB-INF下面的檔案要用這個路徑:getServletContext().getRealPath("/WEB-INF/");

但是那是後端訪問方法,我是要在前端引用那些css
於是我的前端頁面出現了這個東西

<%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

在申明之後,引入css的時候,就用的

<link rel="stylesheet" href="<%=basePath%>css/login_style.css" type="text/css">

之後就能正常顯示了。
image
只能說確實好看。
專案地址為 https://gitee.com/zxeao/Study_Station.git
可以點個star嘛?

是學生,正在學習,自己遇到的問題寫點部落格,如有錯誤,請諒解,如果發現了錯誤可以評論一下。

相關文章