1. 程式人生 > >設定JSP頁面不快取,也就是頁面立刻失效

設定JSP頁面不快取,也就是頁面立刻失效

jsp設定頁面過期
服務端方法:
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", -10);
%>
在登陸頁面和登陸後頁面均加入這段程式碼即可
注意,一定要在登陸頁面(或類似功能的頁面使session無效)

客戶端方法:

meta是用來在HTML文件中模擬HTTP協議的響應頭報文。meta 標籤用於網頁的<head>與</head>中,meta 標籤的用處很多。meta 的屬性有兩種:name和http-equiv。name屬性主要用於描述網頁,對應於content(網頁內容),以便於搜尋引擎機器人查詢、分類(目前幾乎所有的搜尋引擎都使用網上機器人自動查詢meta值來給網頁分類)。這其中最重要的是description(站點在搜尋引擎上的描述)和keywords(分類關鍵詞),所以應該給每頁加一個meta值。比較常用的有以下幾個:
name 屬性

1、<meta name="Generator" contect="">用以說明生成工具(如Microsoft FrontPage 4.0)等;

2、<meta name="KEYWords" contect="">向搜尋引擎說明你的網頁的關鍵詞;

3、<meta name="DEscription" contect="">告訴搜尋引擎你的站點的主要內容;

4、<meta name="Author" contect="你的姓名">告訴搜尋引擎你的站點的製作的作者;

5、<meta name="Robots" contect=

"all|none|index|noindex|follow|nofollow">

其中的屬性說明如下:

設定為all:檔案將被檢索,且頁面上的連結可以被查詢;

設定為none:檔案將不被檢索,且頁面上的連結不可以被查詢;

設定為index:檔案將被檢索;

設定為follow:頁面上的連結可以被查詢;

設定為noindex:檔案將不被檢索,但頁面上的連結可以被查詢;

設定為nofollow:檔案將不被檢索,頁面上的連結可以被查詢。

http-equiv屬性

1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80">

和 <meta http-equiv="Content-Language" contect="zh-CN">用以說明主頁製作所使用的文字以及語言;

又如英文是ISO-8859-1字符集,還有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集;

2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定時讓網頁在指定的時間n內,跳轉到頁面http;//yourlink;

3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用於設定網頁的到期時間,一旦過期則必須到伺服器上重新呼叫。需要注意的是必須使用GMT時間格式;

4、<meta http-equiv="Pragma" contect="no-cache">是用於設定禁止瀏覽器從本地機的快取中調閱頁面內容,設定後一旦離開網頁就無法從Cache中再調出;

5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT">cookie設定,如果網頁過期,存檔的cookie將被刪除。需要注意的也是必須使用GMT時間格式;

6、<meta http-equiv="Pics-label" contect="">網頁等級評定,在IE的internet選項中有一項內容設定,可以防止瀏覽一些受限制的網站,而網站的限制級別就是通過meta屬性來設定的;

7、<meta http-equiv="windows-Target" contect="_top">強制頁面在當前視窗中以獨立頁面顯示,可以防止自己的網頁被別人當作一個frame頁呼叫;

8、<meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion=

50)">和<meta http-equiv="Page-Exit"

contect="revealTrans(duration=20,transtion

=6)">設定進入和離開頁面時的特殊效果,這個功能即FrontPage中的“格式/網頁過渡”,不過所加的頁面不能夠是一個frame頁面。

上面是從網上弄到的資訊。

我使用的開發工具是MyEclipse,當我建立一個Jsp頁面時,MyEclipse就會為我自動建立一個模版,如:
1.MyJsp.jsp:
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">   
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<body>
  <html:form action="userAction">
   Username:<html:text property="username"></html:text>
   <html:submit value="提交"/>
  </html:form>
</body>

2.MyJsp1.jsp:
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">   
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
 <body>
   username:${requestScope.userForm.username}
 </body>

3.struts-config.xml:
<form-beans>
  <form-bean name="userForm" type="com.andy.struts.form.UserForm"></form-bean>
</form-beans>
<forward name="toMyJsp1" path="/MyJsp1.jsp"></forward>
<action-mappings>
  <action path="/userAction" type="com.andy.struts.action.UserAction" name="userForm" scope="request" validate="true">
  </action>
</action-mappings>

4.UserForm:
package com.andy.struts.form;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class UserForm extends ActionForm {
   private String username=null;
  
   public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
}

5.UserAction:
return arg0.findForward("toMyJsp1");

當我在瀏覽器視窗上輸入http://localhost:8086/WebRoot/MyJsp.jsp後,並在文字框中輸入andy,單擊[提交]按鈕,結果正確顯示username:andy,但我單擊瀏覽器視窗上的[後退]按鈕時,可以回到MyJsp.jsp頁面,並且在文字框中顯示andy.這是為什麼呢?在MyJsp.jsp和MyJsp1.jsp頁面中不是在<meta/>中設定了expires、pragma和cache-control嗎?就算把expires設定為-1,也是一樣的.至於為什麼出現疑問,是因為我的個人理解是此時這樣的設定不是代表著頁面失效嗎,既然這樣,當我單擊[後退]按鈕時,應該有所提示的才對.而且我還發現如果在提交到MyJsp1.jsp頁面後,在單擊[後退]按鈕之前,我改變了MyJsp.jsp的內容並儲存,之後,我再在瀏覽器上單擊[後退]按鈕,結果發現此時的MyJsp.jsp頁面並不自動更新,而是顯示提交那時刻的內容.只有在我按下瀏覽器視窗上的[重新整理]按鈕後才顯示更新的內容.這個也說明了,當我單擊[後退]按鈕時,瀏覽器有可能是從緩衝中提取資料的,而不是到伺服器提取資料.那麼先前設定expires、pragma和cache-control不是沒有任何作用?(個人感覺).

此後,我通過網上搜索到一些關於如何使[後退]按鈕時效的方法,其中有:
一、
<script language='javascript'>
history.go(1);
</script>

我理解上面程式碼的意思,但使用起來會怎麼樣呢?讓我們試一下,首先我在MyJsp.jsp檔案中添加了上面的這段程式碼,然後開啟瀏覽器輸入地址,並顯示MyJsp.jsp頁面的內容.接著我在文字框中輸入andy,並提交,顯示username:andy,然後我按下瀏覽器上的[後退]按鈕,發現不能回到之前的MyJsp.jsp頁面.看來這個方法不錯.(但如果是使用location.replace(sURL),我想[後退]按鈕應該是灰色的,即不可用).

二、
第二中方法使用的就是上面說的服務端方法和客戶端方法,但上面已經說了客戶端已經不可用,那麼伺服器端會怎麼樣呢?首先我把先前的更改還原到初始狀態,即去掉先前的script指令碼程式碼,然後新增如下程式碼:
<%
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", -10);
%>
重新開啟瀏覽器,在視窗中輸入地址,在顯示的文字框中輸入andy並提交,顯示username:andy,此時按下瀏覽器視窗上的[後退]按鈕,發現可以回到原來的MyJsp.jsp頁面,而上面所說的登入頁面和登入後頁面都需加,其實我在MyJsp.jsp和MyJsp1.jsp兩個都加了,結果還是一樣,一樣都可以後退到原來的MyJsp.jsp頁面.兩者還是有點區別的:

即當我只在MyJsp.jsp頁面新增程式碼時,不但可以按下[後退]按鈕回到MyJsp.jsp頁面,並且此時文字框竟不顯示任何內容(驚奇!注意咯),而且回到MyJsp.jsp頁面後也可以按下[前進]按鈕,回到MyJsp1.jsp頁面,並且此時的MyJsp1.jsp頁面的內容跟上次[提交]後顯示的一樣(就算是按下[前進]前修改了MyJsp1.jsp或是在MyJsp.jsp頁面的文字框中輸入內容,按下[前進]後也不會顯示更新的內容).

但如果MyJsp.jsp和MyJsp1.jsp頁面都新增的話,有一步是不一樣的,即我[後退]到原來的MyJsp.jsp頁面後,按下[前進]時,竟顯示如下內容:

警告: 網頁已經過期您申請的網頁是用表單中提交的資訊建立的。該網頁已失效。由於有安全預警功能,Internet Explorer 不會自動再次提交您的資訊。

要重新提交資訊並檢視該網頁,請單擊重新整理按鈕。

單擊一下[重新整理]按鈕後,發現彈出一個對話方塊,顯示警告資訊,如下:
!不重新發送資訊,則無法重新整理頁面,請單擊"重試"再次傳送資訊,或單擊"取消"返回正檢視的頁.

單擊[重試],結果為:username:andy

後來,我在網上發現有人也有跟我一樣的困惑,如:
aspire-tech [普通使用者]
請教一下,jsp裡面當按IE返回時設定頁面過期的問題。
我在jsp檔案前面加上了下面的:
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>
另外在<head>頭裡面加上了:
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<meta http-equiv="Expires" CONTENT="0">
<meta http-equiv="Cache-Control" CONTENT="no-cache">
<meta http-equiv="Pragma" CONTENT="no-cache">

但是按IE返回的時候頁面沒有提示過期,奇怪的是再按IE前進提示過期。
請大蝦指教!

maxtiger [普通使用者]
<meta http-equiv="expires" content="wed, 26 Feb 1997 08:21:57 GMT">

kidman [普通使用者]
如果你前進的那頁有提交動作的話,應該是會提示過期的~~~

funove007 [普通使用者]
問:我有一個關於 HTML 頁截止日期的問題(Windows? XP 和 Microsoft Internet Explorer 6.x)。在 Expire1.htm 中,我指定了頁立即過期:

<html>
<head>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="expires" CONTENT="-1">
</head><body>
<a href="HtmlPage1.htm">HtmlPage1.htm</a>
</body>
</html>

使用 Internet Explorer 時,如果我瀏覽到 Expire1.htm(使用 HTTP,不是 HTTPS),則當我單擊連結之後,會被帶入 HtmlPage1.htm。如果我更改 Expire1.htm 的內容,然後單擊“Back”按鈕,得到的是 Expire1.htm 的舊內容,而不是新內容。在 Internet Explorer 中,我選擇了在每次訪問該頁時都“檢查”儲存頁的更新版本的選項。

答:此行為是設計使然。通過使用 META 標頭,您可以依賴於 MSHTML 來判斷是否刪除快取中的內容,快取中內容的刪除只由 MSHTML 在這些內容通過安全套接字層 (SSL) 下載時執行。因為您使用“Forward”和“Back”按鈕,所以不是真正的導航;您只是在顯示前面下載的內容。如果連線不是一個 SSL 連線,MSHTML 則只是為儲存在快取中的內容設定 Expiration 標頭。

這些操作取決於 WININET 在下載時是否快取了檔案,您通過在整個網站上設定標頭已經發現了這個情況。如果您控制 IIS 伺服器或宿主這些 HTML 檔案的 Web 伺服器,則可以基於站點、目錄或檔案設定 Expires 標頭,因此可以一直向下到檔案級別,獲得合適的快取行為。

從 Expire1.htm 導航到 HtmlPage1.htm 之後,但在單擊“Forward”和“Back”按鈕之前,您需要檢視“Tools | Internet options | Settings button | View Files”按鈕。在此顯示中,找到 Expires1.htm,然後檢視“截止期”列。是否存在一個日期/時間反映您何時訪問了該檔案?如果是,圖 2 中顯示的規則會在使用“Forward”和“Back”按鈕時應用到這些經過快取的內容。您可能會看到,使用“Forward”和“Back”按鈕時,只有當前 Internet Explorer 會話期間尚未下載內容的情況下才會發生同步。

現在為了獲得您希望的行為,在載入了 HtmlPage1.htm 之後,請不要使用“Forward”和“Back”按鈕來訪問 Expire1.htm,而是單擊位址列,然後手動輸入 Expire1.htm 的完整路徑。這樣應該會導致顯示新內容,因為現在快取規則是基於超連結單擊或位址列導航的。這種情況下,內容的“截止期”將決定是否應該再次下載該內容。

我看了上面funove007使用者的內容後,按照[Tools | Internet options | Settings button | View Files]步驟看到此時臨時檔案裡面只有一個字尾為.jsp的檔案,即MyJsp.jsp,而MyJsp1.jsp沒有看到,而且[截止期]為[無].(不管是隻有MyJsp.jsp添加了還是兩個檔案都新增,其情況是一樣的).

後來兩個檔案都不添加了,可在臨時檔案下看到的情況還是一樣的,即[截止期]為[無].

上面有個maxtiger使用者提到的方法是使用<meta http-equiv="expires" content="wed, 26 Feb 1997 08:21:57 GMT">,我也不知道行不行,決定試一下,現把之前在兩個檔案中新增的程式碼去掉,然後把<meta http-equiv="expires" content="0">改為<meta http-equiv="expires" content="wed, 26 Feb 1997 08:21:57 GMT">,開啟瀏覽器,在視窗中輸入地址,並在文字框中輸入andy,提交,正確顯示後,發現按下[後退]和[前進]都可行.難道需要新增
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>

試一下,接著我在MyJsp.jsp頁面中新增這段程式碼,發現還是可以[後退]和[前進]..

看來,到目前為止,只有第一種方法可行,而第二種方法不可行的真正原因在哪,我也不清楚,希望以後可以得到解決.