LiferayDynamicCSSFilter方法的研究-從請求檔案URI到獲取資原始檔真實路徑

餘二五發表於2017-11-07

現在我們接著上面討論來解決疑問1:如何獲取資原始檔的真實路徑。


引入:

我們上文中已經說到,我們最開始是從請求URI來的,它的位置是 /html/portlet/login/css/main.css

接下來通過簡單的字串操作獲取的requestPath也為 /html/portlet/login/css/main.css

143243506.png

現在我們來看看如何通過這個資訊來獲取這個檔案的真實在Liferay伺服器上的路徑的。


分析:

對應的程式碼如下:

1
2
String realPath = ServletContextUtil.getRealPath(
        _servletContext, requestPath);


祕密就在ServletContextUtil的getRealPath()方法中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static String getRealPath(
        ServletContext servletContext, String path) {
        String realPath = servletContext.getRealPath(path);
        if ((realPath == null) && ServerDetector.isWebLogic()) {
            String rootDir = getRootDir(servletContext);
            if (path.startsWith(StringPool.SLASH)) {
                realPath = rootDir + path.substring(1);
            }
            else {
                realPath = rootDir + path;
            }
            if (!FileUtil.exists(realPath)) {
                realPath = null;
            }
        }
        return realPath;
    }


從這段程式碼看出它獲取的方式很簡單,就是在第3行問ServletContext索取這個資訊

具體走了多個呼叫後,它最終是向catalina.jar中的FileDirContext呼叫doGetRealPath()來獲取的。


而這個FileDirContext已經定義了absoluteBase為我們的Liferay tomcat的ROOT目錄:

144620235.png


所以,它最終只要吧我們請求的requestPath拼接到absoluteBase後面就獲得了真正的資源的絕對路徑。



結論:

從請求檔案URI到獲取資原始檔真實路徑是Liferay容器完成的,它的主要操作是用absoluteBase和請求URI字串拼接而成就可以得到最終資原始檔位置了。如下大家可以對比下requestPath和realPath

145918850.png

本文轉自 charles_wang888 51CTO部落格,原文連結:http://blog.51cto.com/supercharles888/1282779,如需轉載請自行聯絡原作者


相關文章