問(wèn)題描述
業(yè)務(wù)的支付支持分多次支付恳守,每次支付的金額由購(gòu)買人自己決定峦耘,即用購(gòu)買人自己輸入驳概。點(diǎn)擊下一步
跳轉(zhuǎn)到收銀臺(tái)
赤嚼,提交方式是post form 表單
,跳轉(zhuǎn)到收銀臺(tái)
之后顺又,選擇相應(yīng)的支付方式更卒。 。今天測(cè)試測(cè)出了一個(gè)bug
,確認(rèn)收貨頁(yè)面展現(xiàn)的支付金額是0.01
元稚照,而實(shí)際的支付金額為0.03
元蹂空。
瀏覽器:Chrome俯萌。
查找問(wèn)題
拿到業(yè)務(wù)單號(hào),查詢支付記錄上枕,查詢到了該業(yè)務(wù)單號(hào)在不到1s
的時(shí)間間隔出現(xiàn)了兩筆業(yè)務(wù)支付訂單號(hào)和業(yè)務(wù)單號(hào)相同的記錄咐熙,而業(yè)務(wù)支付單號(hào)應(yīng)該是全局唯一的。從測(cè)試那得知他的操作方式是第一次輸入金額0.01
,點(diǎn)擊下一步辨萍,跳轉(zhuǎn)到收銀臺(tái)
棋恼,然后點(diǎn)擊瀏覽器的回退按鈕,返回到上一頁(yè)锈玉,修改支付金額為0.03
爪飘,點(diǎn)擊下一步,跳轉(zhuǎn)到收銀臺(tái)
拉背,進(jìn)行支付师崎。那么這極有可能是由于瀏覽器后退,沒(méi)有刷新頁(yè)面造成的去团。
解決方案
在解決這個(gè)問(wèn)題的過(guò)程中抡诞,嘗試了如下幾種方案:
- 通過(guò)
meta 標(biāo)簽
設(shè)置不緩存頁(yè)面
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Expires" content="0">
但是很遺憾的是,并沒(méi)有起作用土陪。有網(wǎng)友說(shuō)昼汗,需要Cache-Control:no-cache
需要修改為Cache-Control:no-store
但是瀏覽器后退仍然是從緩存中讀取from disk cache
。
有網(wǎng)友說(shuō)現(xiàn)在不支持meta 標(biāo)簽
去緩存鬼雀,不知是否是這個(gè)原因顷窒?
- 通過(guò)
過(guò)濾器
設(shè)置服務(wù)端響應(yīng)的Cache-Control:no-cache
,設(shè)置緩存的過(guò)期為立刻過(guò)期Expires:-1
/// <summary>
/// 清除頁(yè)面緩存
/// </summary>
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.CacheControl = "no-cache";
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Headers.Set("Pragma", "no-cache");
filterContext.HttpContext.Response.Headers.Set("Expires", "-1");
base.OnResultExecuted(filterContext);
}
}
很遺憾的是,仍然是from disk cache
從緩存中讀取源哩,只能是強(qiáng)制刷新了鞋吉。
- 通過(guò)
js windows.name
控制,重新reload
頁(yè)面
window.onload = function () {
if (window.name == "hasLoad") {
location.reload();
window.name = "";
} else {
window.name = "hasLoad";
}
}
這個(gè)方案成功的解決了這個(gè)問(wèn)題励烦,但是存在一個(gè)缺點(diǎn)是谓着,除第一次訪問(wèn)這個(gè)頁(yè)面外,以后再訪問(wèn)這個(gè)頁(yè)面都會(huì)reload
兩次坛掠。