form表單重復(fù)提交是在多用戶Web應(yīng)用中最常見、帶來很多麻煩的一個問題。有很多的應(yīng)用場景都會遇到重復(fù)提交問題
(1)點(diǎn)擊提交按鈕兩次。
(2)點(diǎn)擊刷新按鈕。
(3)使用瀏覽器后退按鈕重復(fù)之前的操作 導(dǎo)致重復(fù)提交表單。
(4)瀏覽器重復(fù)的HTTP請求。
(5)用戶提交表單時可能因為網(wǎng)速的原因,或者網(wǎng)頁被惡意刷新,致使同一條記錄重復(fù)插入到數(shù)據(jù)庫中,這是一個比較棘手的問題。我們可以從客戶端和服務(wù)器端一起著手,設(shè)法避免同一表單的重復(fù)提交。
一 .用JavaScript 禁用提交按鈕
<script type="text/javascript">
//設(shè)置disabed屬性
$("input[type='submit']").attr("disabled",true);
或者 $("input[type='submit']").attr("disabled","disabled");
//移除disabed屬性
$("input[type='submit']").attr("disabled",false);
或者 $("input[type='submit']").attr("disabled","");
</script>
二. 用Session防止表單重復(fù)提交:
在服務(wù)器端生成一個唯一的隨機(jī)標(biāo)識號,專業(yè)術(shù)語稱為Token(令牌),同時在當(dāng)前用戶的Session域中保存這個Token。然后將Token發(fā)送到客戶端的Form表單中,在Form表單中使用隱藏域來存儲這個Token,表單提交的時候連同這個Token一起提交到服務(wù)器端,然后在服務(wù)器端判斷客戶端提交上來的Token與服務(wù)器端生成的Token是否一致,如果不一致,那就是重復(fù)提交了,此時服務(wù)器端就可以不處理重復(fù)提交的表單。如果相同則處理表單提交,處理完后清除當(dāng)前用戶的Session域中存儲的標(biāo)識號。
public class FormServlet extends HttpServlet {
private static final long serialVersionUID = -884689940866074733L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String token = UUID.randomUUID().toString();//創(chuàng)建令牌
System.out.println("在FormServlet中生成的token:"+token);
request.getSession().setAttribute("token", token); //在服務(wù)器使用session保存token(令牌)
request.getRequestDispatcher("/form.jsp").forward(request, response);//跳轉(zhuǎn)到form.jsp頁面
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
原創(chuàng)作者:吳小糖文章來源:http://www.zghlxwxcb.cn/news/detail-814766.html
創(chuàng)作時間:2024.1.9文章來源地址http://www.zghlxwxcb.cn/news/detail-814766.html
到了這里,關(guān)于HTML5中form表單防止重復(fù)提交的兩種方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!