1、什么是表單重復提交
1.1 刷新頁面
在jsp頁面點擊提交后,會有一個post請求發到testController中,該Controller直接返回success視圖。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首頁</title>
</head>
<form action="/hello" method="post">
<input type="submit">
</form>
<body>
</body>
</html>
@RequestMapping("hello")
public String test() throws InterruptedException {
System.out.println("重復提交");
//Thread.sleep(10000);
return "success";
}
此時雖然頁面跳轉到了success視圖,但是瀏覽器URL里顯示的還是hello,如果此時刷新瀏覽器那么會重復是向后台提交數據。


1.2 響應過慢
上面這種情況還可以通過redirect解決,即登陸后的頁面重定向到新的頁面來避免。但如果是因為網速過慢導致的頁面沒有發生跳轉,用戶以為此時沒有發出請求而重復點擊提交按鈕也會造成表單重復提交。
還是上面的jsp,我在Controller里加入睡眠來模擬網速太慢造成的相應過慢。此時點擊提交后會看到頁面處在加載狀態但是沒有發生跳轉,如果再次點擊提交也會造成重復提交。
@RequestMapping("hello")
public String test() throws InterruptedException {
System.out.println("重復提交");
Thread.sleep(10000);
return "success";
}
2、后端如何解決表單重復提交
表單重復提交在前端可以通過js來解決,但是如果瀏覽器禁用了js就無效了。
通過token來實現這一功能需要分為兩步,需要對兩個Controller下手:1、對跳轉到登陸頁面的Controller,每次來都這個Controller的時候加入Token 2、對post請求的Controller,每次檢驗並刪除Token。
