項(xiàng)目需求:先進(jìn)入內(nèi)容列表頁面,頁面顯示數(shù)據(jù),每一條數(shù)據(jù)對(duì)應(yīng)一個(gè)標(biāo)題,點(diǎn)擊標(biāo)題(超鏈接)進(jìn)入內(nèi)容頁,點(diǎn)擊返回(超鏈接)可以回到內(nèi)容列表頁面
本來想使用history.go(-1)簡(jiǎn)單地返回上一頁,但卻出現(xiàn)了一個(gè)奇怪的現(xiàn)象
1進(jìn)入內(nèi)容列表頁,點(diǎn)擊內(nèi)容頁后返回成功
2在內(nèi)容列表頁點(diǎn)擊【搜索】,獲得新數(shù)據(jù)后點(diǎn)擊標(biāo)題進(jìn)入內(nèi)容頁,點(diǎn)擊【返回】,出現(xiàn)網(wǎng)頁已過期錯(cuò)誤頁面
3點(diǎn)擊【搜索】,再點(diǎn)擊【下一頁】,然后再點(diǎn)擊標(biāo)題進(jìn)入內(nèi)容頁,點(diǎn)擊【返回】,返回成功。
找了很久,終于發(fā)現(xiàn),原來問題出在提交方式(Get/Post)上,如果使用Post提交,history.go(-1)返回會(huì)出現(xiàn)網(wǎng)頁已過期的錯(cuò)誤
而超鏈接默認(rèn)是get方法,<s:form>默認(rèn)為Post方式
而我第一次【搜索】的時(shí)候使用到了<s:form>表單提交,提交方式為POST,相對(duì)于內(nèi)容頁,返回的頁面的提交方式是Post,因此出現(xiàn)問題【2】
如果我【搜索】后再點(diǎn)擊【下一頁】,由于我的上下頁是用超鏈接實(shí)現(xiàn)的,因此相對(duì)于內(nèi)容頁,返回的頁面的提交方式變回get,因此返回成功。
解決方案:
1將提交方式改為超鏈接的形式:xxxx.action?page=XX¶me=XX......
2修改form的提交方式
<s:form method="get" action="XXX.action?" >
3如果只是考慮一個(gè)頁面(action)的情況,可以修改返回的方式,不用history.go(-1),使用url
<a href="xxxx.action?page=XX¶me=XX...">返回上一頁</a>
4通過js獲取上一個(gè)頁面的url路徑,然后判斷該返回哪一個(gè)Action及是否使用history.go(-1)
function goToHistory(){
var str=document.referrer;//上一個(gè)點(diǎn)擊進(jìn)來的頁面
if(str!=null){
str = str.split("?")[0].split("/");
var actionName = str[(str.length-1)];//獲取action名字
if(actionName=="MyText.action"){
location = "MyText.action";//返回MyText
}else if(actionName=="YouText.action"){
var url = "YouText.action"//返回YouText
location = url;
}else{
history.go(-1);
}
}else{
alert("這個(gè)頁面是初始頁面");
}
}
document.referrer可以獲取上個(gè)頁面的整個(gè)url(含參數(shù)),詳細(xì)獲取參數(shù)可以參考http://blog.csdn.net/kaidishi/article/details/9732913
當(dāng)然你也可以將參數(shù)傳遞進(jìn)方法里,以goToHistory(parame1,parame2)的方式進(jìn)行修改【如果提交數(shù)據(jù)并非保密的情況,建議使用第2種方式】
另外的一種解釋:
javascript:history.go(-1)返回上一頁時(shí),網(wǎng)頁已過期
解決辦法:首先試試back()或go(-2),若依然不行,則取消禁用頁面緩存的限制
session_cache_limiter('private,must-revalidate');
作用:當(dāng)session_cache_limiter('private')時(shí),用處是讓表單history.go(-1)的時(shí)候,填寫內(nèi)容不丟失。
go(-2)后再forward(1).
為什么我在點(diǎn)擊瀏覽器的后退按鈕后,所有字段的信息都被清空了
答:這是由于你在你的表單提交頁面中使用了 session_start 函數(shù)。
因?yàn)槲覀兒笸藶g覽的是緩存頁,而該函數(shù)會(huì)強(qiáng)制當(dāng)前頁面不被緩存。所以出現(xiàn)了’警告: 網(wǎng)頁已經(jīng)過期!’.
這些信息,而我們不得不刷新下才能正確顯示,對(duì)于一個(gè)程序人員來說有可能無所謂,但是對(duì)于一個(gè)internet網(wǎng)上的一個(gè)顧客來說,看到該頁面,他有可能關(guān)閉該頁面,而不會(huì)去查看這些信息!
還有一個(gè)原因就是當(dāng)一個(gè)網(wǎng)站流量比較大的時(shí)候,緩存是我們程序人員最好的工具,如果失去了這把工具,那么你所在的虛擬服務(wù)器必將受到考驗(yàn)!
解決辦法為,
1、不使用session_start()函數(shù)。
2、在你的 Session_start 函數(shù)后加入 header("Cache-control: private"); 注意在本行之前你的PHP程序不能有任何輸出。
還有基于session的解決方法,在session_start前加上
session_cache_limiter('nocache');// 清空表單
session_cache_limiter('private'); //不清空表單,只在session生效期間
session_cache_limiter('public'); //不清空表單,如同沒使用session一般
在開發(fā)過程中,往往因?yàn)楸韱纬鲥e(cuò)而返回頁面的時(shí)候填寫的信息都不見了,為了支持頁面回跳,可以通過兩種方法實(shí)現(xiàn)。
第一,使用Header方法設(shè)置消息頭Cache-control
引用:
header(’Cache-control: private, must-revalidate’); //支持頁面回跳
第二,使用session_cache_limiter方法
session_cache_limiter('private, must-revalidate'); //注意要寫在session_start方法之前
<meta http-equiv="Cache-Control" CONTENT="private,must-revalidate">