1 จาวาสคริปต์ ตั้งค่าตัวแปรและอนุญาตให้ส่งเพียงครั้งเดียวเท่านั้น
<script language="javascript">
var checkSubmitFlg = false;
ฟังก์ชัน checkSubmit() {
if (checkSubmitFlg == true) {
return false;
}
checkSubmitFlg = true
;
}
document.ondblclick = function docondblclick() {
window.event
.returnValue=
false;
}
document.onclick = function doconclick() {
if
(checkSubmitFlg) {
window.event.returnValue = false
;
<html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">
2 ยังคงใช้ javascript อยู่ ให้ตั้งค่าปุ่มส่งหรือรูปภาพเพื่อปิดการใช้งาน
<html:form action="myAction.do" method ="post"
onsubmit="getElById('submitInput').disabled = true; return true;">
<html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
< / html:form>
3 ใช้กลไกโทเค็นการซิงโครไนซ์ของ struts
เพื่อแก้ไขปัญหาการส่งซ้ำในเว็บแอปพลิเคชัน Struts ยังมีการใช้งานอ้างอิง
หลักการพื้นฐาน:
ก่อนที่จะประมวลผลคำขอที่เข้ามา เซิร์ฟเวอร์จะเปรียบเทียบค่าโทเค็นที่อยู่ในคำขอกับค่าโทเค็นที่บันทึกไว้ในเซสชันผู้ใช้ปัจจุบันเพื่อดูว่ามีค่าที่ตรงกันหรือไม่ หลังจากที่คำขอได้รับการประมวลผลและก่อนที่การตอบกลับจะถูกส่งไปยังไคลเอนต์ โทเค็นใหม่จะถูกสร้างขึ้น นอกเหนือจากการส่งต่อไปยังไคลเอนต์แล้ว โทเค็นนี้จะแทนที่โทเค็นเก่าที่บันทึกไว้ในเซสชันผู้ใช้ด้วย ด้วยวิธีนี้ หากผู้ใช้กลับไปที่หน้าการส่งก่อนหน้าและส่งอีกครั้ง โทเค็นที่ไคลเอนต์ส่งผ่านจะไม่สอดคล้องกับโทเค็นบนฝั่งเซิร์ฟเวอร์ ดังนั้นจึงป้องกันการส่งซ้ำได้อย่างมีประสิทธิภาพ
if (isTokenValid(request, true)) {
// รหัสของคุณที่นี่
return mapping.findForward("success");
} else {
saveToken(request);
returnmapping.findForward
("submitagain");
}
ID และเวลาระบบปัจจุบันใช้เพื่อสร้างโทเค็นที่ไม่ซ้ำกัน (สำหรับแต่ละเซสชัน) สำหรับการใช้งานเฉพาะ โปรดดูเมธอด GenerateToken() ในคลาส TokenProcessor
1. //ตรวจสอบโทเค็นควบคุมธุรกรรม <html:form> จะสร้างโทเค็นตัวแทนอินพุตโดยนัยตามตัวระบุในเซสชันเพื่อป้องกันการส่งซ้ำ
2. ในการดำเนินการ:
//<input type="hidden" ชื่อ ="org.apache.struts.taglib.html.TOKEN"
// value="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,
New ActionError("error.transaction.token") ) ;
ResetToken(คำขอ); //ลบโทเค็นในเซสชัน
3 การดำเนินการมีวิธีสร้างโทเค็น
ที่
ได้รับการป้องกัน String GenerateToken(คำขอ HttpServletRequest) {
HttpSession session = request.getSession(
] = session .getId ().getBytes();
ไบต์ตอนนี้[] =
ใหม่ ยาว(System.currentTimeMillis()).toString().getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update
(id) ;
.update(ตอนนี้);
return (toHex(
md.digest()));
} catch (IllegalStateException e) {
return (null);
} catch (NoSuchAlgorithmException e) {
return (null)
;