對于重復(fù)提交這一問題我們通常有兩種解決方法:
- 通過重定向
- 通過session token
這里我們主要介紹session token機(jī)制邓深,下面我們先介紹token的使用步驟吧:
- 首先我們需要用到struts2標(biāo)簽庫中的標(biāo)簽元素<s:token/>凸舵,如下圖所示:
- 編寫LoginAction:
- 然后配置struts.xml文件:
成功則跳轉(zhuǎn)到output.jsp進(jìn)行數(shù)據(jù)展示宿崭,失敗則跳轉(zhuǎn)到fail.jsp進(jìn)行錯誤消息提示 注:invalid.token是框架規(guī)定的名字,專門用來處理重復(fù)提交的
- 編寫output.jsp丘损、fail.jsp:
這樣就可以解決重復(fù)提交了
現(xiàn)在我們來介紹一下底層的機(jī)制吧:
用struts2標(biāo)簽<s:token/>是為了讓服務(wù)器在解析jsp的時候調(diào)用TokenTag標(biāo)簽處理類组民,而該處理類用于生成唯一隨機(jī)值以及將隨機(jī)值存于session中飞醉,然后又將隨機(jī)值以隱藏域的形式返回給客戶端膀跌,在這一刻遭商,客戶端以及服務(wù)器端擁有著相同的隨機(jī)值,當(dāng)表單提交到服務(wù)器端的時候捅伤,會檢查這兩個值是否相同,如果相同那么認(rèn)為是第一次提交巫玻,并且將session中的隨機(jī)值更新或刪除含滴,然后繼續(xù)執(zhí)行后續(xù)流程卧晓,下一次如果表單仍以之前的隨機(jī)值提交上來的話怠晴,那么服務(wù)器就會檢查到這兩個值不相同,認(rèn)定是重復(fù)提交可很,轉(zhuǎn)到invalid.token結(jié)果中
簡而言之就是以服務(wù)端與客戶端擁有的隨機(jī)值是否相同來作為重復(fù)提交的判斷依據(jù)