?? 最近在看些基礎(chǔ)的東西,順便做下筆記鳄橘。相信大家在平時(shí)網(wǎng)頁使用中刊侯,經(jīng)常會有按鈕重復(fù)點(diǎn)擊章办,然后點(diǎn)不動刷新,還有當(dāng)網(wǎng)絡(luò)延時(shí)比較厲害點(diǎn)了沒反應(yīng)在點(diǎn)擊的重復(fù)提交。為了避免這種情況藕届,總結(jié)了一下4點(diǎn)處理方案
表單重復(fù)提交 ?常用解決辦法挪蹭。
1.通過前端解決(請參考以下的前端代碼)
2.讓提交按鈕只觸發(fā)一次(當(dāng)用戶點(diǎn)擊提交后,再次點(diǎn)擊的時(shí)候不允許調(diào)用后臺接口,和3類似)
3.提交按鈕變灰
4.通過后端解決,使用token+session
思路是:
第一步:
用戶輸入U(xiǎn)RL地址休偶,調(diào)用第一個(gè)后臺接口,代碼如下
package
com.itmayiedu.servlet;
import
java.io.IOException;
import
javax.servlet.ServletException;
import
javax.servlet.annotation.WebServlet;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
javax.servlet.http.HttpSession;
import com.itmayiedu.servlet.session.TokenUtils;
@WebServlet("/LocaFromServlet")
public
class
LocaFromServlet
extends
HttpServlet {
?????@Override
protected
void
doGet(HttpServletRequest req, HttpServletResponse resp)
throws
ServletException, IOException {
???????????? // 生成token
??????????String tokenValue=TokenUtils.
getToken
();
??????????HttpSession session = req.getSession();
??????????session.setAttribute("sessionToken", tokenValue);
??????????req.getRequestDispatcher("from.jsp").forward(req, resp);
?????}
}
第二步:將第一步生成的sessionToken轉(zhuǎn)發(fā)到前端后梁厉,前端的代碼
<%@ page language="java" contentType="text/html; charset=UTF-8"
?????pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Form表單</title>
<script type="text/javascript">
?????var flag = false;//false表示為提交 true 就是已經(jīng)提交
?????function dosubmit(){
???????? //獲取表單提交按鈕
???????? var btnSubmit = document.getElementById("submit");
???????? //將表單提交按鈕設(shè)置為不可用,這樣就可以避免用戶再次點(diǎn)擊提交按鈕
???????? btnSubmit.disabled= "disabled";
???????? //返回true讓表單可以正常提交
???????? return true;
?????}
</script>
</head>
<body>
?????<form action="DoFormServlet"
??????????method="post"? onsubmit="return dosubmit()">
??????????<input type="hidden" name="parameterToken" value="${sessionToken}">
??????????用戶名:<input type="text" name="userName"> <input type="submit"
??????????????value="提交" id="submit"?? >
?????</form>
</body>
</html>
第三步:前端進(jìn)行提交后踏兜,后臺要判斷前端傳過來的sessionToken是否和后臺的sessionToken一樣词顾。一樣的話可以提交,不一樣就說明重復(fù)提交了碱妆,不能提交
package com.itmayiedu.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/DoFormServlet")
public class DoFormServlet extends HttpServlet {
? ? @Override
? ? protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ? resp.setContentType("text/html;charset=utf-8");// 防止瀏覽器顯示亂碼
? ? ? ? if(!isBumit(req)){
? ? ? ? ? ? System.out.println("您提交提交了數(shù)據(jù)..或者token錯(cuò)誤!");
? ? ? ? ? ? resp.getWriter().write("您提交提交了數(shù)據(jù)..或者token錯(cuò)誤!");
? ? ? ? ? ? return ;
? ? ? ? }
? ? ? ? String userName = req.getParameter("userName");
? ? ? ? try {
? ? ? ? ? ? Thread.sleep(300);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? // TODO: handle exception
? ? ? ? }
? ? ? ? System.out.println("數(shù)據(jù)庫插入數(shù)據(jù)...userName:" + userName);
? ? ? ? // 插入數(shù)據(jù)庫...
? ? ? ? resp.getWriter().write("保存成功..");
? ? ? ? req.getSession().removeAttribute("sessionToken");
? ? }
? ? public Boolean isBumit(HttpServletRequest request) {
? ? ? ? String parameterToken = request.getParameter("parameterToken");//通過前端傳的sessionToken
? ? ? ? String sessionToken = (String) request.getSession().getAttribute("sessionToken");//根據(jù)后臺生成的sessionToken
? ? ? ? //判斷是否提交
? ? ? ? if (sessionToken == null) {
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? // 判斷是否是偽造token
? ? ? ? if(!(parameterToken.equals(sessionToken))){
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? return true;
? ? }
}
所使用到的工具類是生成Token的TokenUtils,其實(shí)就是用UUID
package com.itmayiedu.servlet.session;
import java.util.UUID;
public class TokenUtils {
?????static public String getToken() {
??????????return UUID.randomUUID().toString();
?????}
?????public static void main(String[] args) {
??????????System.out.println(TokenUtils.getToken());
?????}