J2EE 開發中首頁的選擇: index.htm 還是 index.jsp
J2EE 開發中,首頁通常可以為 index.htm, index.html, index.jsp, default.htm,default.html,default.jsp 。你是否知道應該用哪一個呢?
以前我以為是無所謂的,都可以。所以我 index.htm , 靜態 HTML 頁面,裡面放一個跳轉,
<meta http-equiv="refresh" content="0;URL=xxx">
轉到一個動態網頁面,比如 http://www.test.com/mysystem/show_home
最近的測試發現,這種辦法是有問題的。主要是這個頁面需要通過 filter 判斷是否已經登入,然後跳轉到“已登入首頁”、“未登入首頁”。這要求此頁面不能被瀏覽器緩衝 http://www.test.com/mysystem/。
在 Tomcat 下,使用 index.htm, 並用 filter 強制要求瀏覽器不快取頁面面,會導致 Tomcat 產生 HTTP response header 如下:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Expires: -1
Cache-Control: no-cache,no-store,private, max-age=0,s-maxage=0, must-revalidate
Pragma: no-cache
Last-Modified: Fri, 15 Oct 2010 01:31:59 GMT
Accept-Ranges: bytes
ETag: W/"680-1287106319011"
Content-Type: text/html
Content-Length: 680
Date: Mon, 08 Nov 2010 07:53:40 GMT
其中的 ETag 為 Tomcat 自動增加,Last-Modified 中時間為 index.htm 檔案時間。
再次訪問 http://www.test.com/mysystem/, 用戶端Firefox 會產生 HTTP request Header:
If-Modified-Since 目前時間。
這時候, 伺服器端 Tomcat 對比 If-Modified-Since 與 index.htm 的檔案時間(Last-Modified), 會直接告訴用戶端"頁面未修改"。這時瀏覽器就從本機快取中取“未登入首頁”,造成“已登入首頁”、“未登入首頁”在用戶端混淆。
問題原因在於“已登入首頁”、“未登入首頁”使用同一個網址, Tomcat 處理 index.htm 時產生了多餘 ETag、錯誤的 Last-Modified。
解決辦法有多種,最簡單的辦法,就是把 index.htm 改為 index.jsp 。
更進一步,為避免問題,我建議把 J2EE 項目中,所有直接存取的 html 檔案,都改成尾碼名為 jsp 。
另外,似乎需要把
<meta http-equiv="refresh" content="0;URL=xxx">
改成
<script language="JavaScript" type="text/javascript">
document.location="xxx";
</script>
因為 meta refresh 在不同的瀏覽器中,被緩衝的方式不同。因此建議避免使用 meta refresh。
來自 http://www.cnblogs.com/jacklondon