解決表單重複提交的問題
現象描述
最近在開發的時候,遇見這樣的問題,當我們在網路狀況不太好的情況、或者一個業務的後臺業務邏輯執行時間較長的時候,使用者可能會點選多次提交或重新整理多次頁面,導致表單資料被提交了多次,導致了可能出現莫名其妙的問題,解決這個問題,我們可以使用session加token的方式進行解決。
方案
JSP程式碼:
<%@ page import="java.util.UUID" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page contentType="text/html;charset=UTF-8" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test jsp</title>
</head>
<body>
<%
String token = UUID.randomUUID().toString().replaceAll("-","");
session.setAttribute("token",token);
%>
<form id="form1" method="post" action="/user/doSomething.do">
username : <input type="text" id="username" value=""/>
password : <input type="text" id="password" value=""/>
<input type="hidden" name="formtoken" value="<%=token%>" >
<input type="submit" value="submit"/>
</form>
</body>
</html>
Controller層:
@Controller
@RequestMapping(value="user")
public class UserController {
@RequestMapping(value="doSomething.do")
public String doSometing(String username, String password, HttpServletRequest request, RedirectAttributes attr) {
String formToken = request.getParameter("formtoken");
HttpSession session = request.getSession();
String token = (String)session.getAttribute("token");
if (formToken.equals(token)) {
session.removeAttribute("token");
} else {
attr.addFlashAttribute("msg", "請不要重複提交!");
return "redirect:error";
}
}
}
如果有多個Controller的方法都需要進行校驗,可以寫一個單獨的校驗方法,使用@ModelAttribute註解,這樣讓它在所有方法執行之前執行,校驗是否表單重複提交了
@Controller
@RequestMapping(value="user")
public class UserController {
@ModelAttribute
public void checkForm(HttpServletRequest request, Model model) {
String formToken = request.getParameter("formtoken");
HttpSession session = request.getSession();
String token = (String)session.getAttribute("token");
if (formToken.equals(token)) {
session.removeAttribute("token");
model.addAttribute("checkResult", "success");
} else {
model.addAttribute("checkResult", "fail");
}
}
@RequestMapping(value="doSomething.do")
public String doSometing(@ModelAttribute String checkResult, String username, String password, RedirectAttributes attr) {
if (checkResult != null && checkResult.equals("success"))
{
doSomething(username, password);
} else {
attr.addFlashAttribute("msg","請不要重複提交");
return "redirect:error";
}
}
}
原理
當多次提交的時候,session中的token已經更新,但是form中的token沒有變化,因此可以用此進行校驗。
相關文章
- 簡單介紹redis分散式鎖解決表單重複提交的問題Redis分散式
- 關於ajax提交表單,重複提交解決方法
- PHP防止表單重複提交的解決方法PHP
- PHP 防止表單重複提交PHP
- java 表單避免重複提交?Java
- 防止表單重複提交的程式碼
- jFinal避免表單重複提交
- 防止表單重複提交的幾種策略
- Spring MVC表單防重複提交SpringMVC
- strust2 重複提交的問題Rust
- iReport列印為excel表頭重複問題解決Excel
- PHP防止使用者重複提交表單PHP
- 如何利用限流解決遊戲陪玩app開發中的重複提交問題?遊戲APP
- 如何解決表單提交的中文亂碼問題
- 8 種方案解決重複提交問題!你選擇哪一種呀?
- Spring Boot + Redis 解決陪玩平臺原始碼重複提交問題Spring BootRedis原始碼
- 前臺防止表單重複提交的方法。Jquery、jsjQueryJS
- JavaWeb——驗證碼功能解決表單重複提交問題(使用谷歌驗證碼jar包為例)JavaWeb谷歌JAR
- RCmongodb出現id重複問題的簡單解決辦法jztMongoDB
- 解決winform窗體重複建立問題ORM
- 解決生產日誌重複列印的問題
- 解決alertmanager重複傳送訊息的問題
- java遠端提交表單問題Java
- 簡單問題複雜著解決
- 快速解決mongodb出現id重複問題MongoDB
- 重複登入問題最終解決方法
- 專案分享七:客戶端防止表單重複提交客戶端
- Springboot+Redisson自定義註解一次解決重複提交問題(含原始碼)Spring BootRedis原始碼
- 解決Linq.ToDictionary()時的鍵重複問題
- 求助bangjava遠端提交表單問題Java
- 分散式重複提交問題架構設計思路分散式架構
- 解決 HttpServletRequest 的輸入流不能重複讀的問題HTTPServlet
- SpringMVC後臺token防重複提交解決方案SpringMVC
- Casperjs中fill提交表單遇到的問題JS
- ASP.NET下的表單提交問題 (轉)ASP.NET
- kafka9重複消費問題解決Kafka
- PHP透過session判斷防止表單重複提交例項PHPSession
- Java IO 建立檔案解決檔名重複問題Java