防止表單重復(fù)提交

第一種(JavaScript):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML>

<html>

? <head>

? ? <title>Form表單</title>

? ? ? ? <script type="text/javascript">

? ? ? ? var isCommitted = false;//表單是否已經(jīng)提交標識,默認為false

? ? ? ? function dosubmit(){

? ? ? ? ? ? if(isCommitted==false){

? ? ? ? ? ? ? ? isCommitted = true;//提交表單后,將表單是否已經(jīng)提交標識設(shè)置為true

? ? ? ? ? ? ? ? return true;//返回true讓表單正常提交

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? return false;//返回false那么表單將不提交

? ? ? ? ? ? }

? ? ? ? }

? ? </script>

? </head>

? <body>

? ? ? <form action="${pageContext.request.contextPath}/servlet/DoFormServlet" onsubmit="return dosubmit()" method="post">

? ? ? ? 用戶名:<input type="text" name="username">

? ? ? ? <input type="submit" value="提交" id="submit">

? ? </form>

? </body>

</html>

第二種(利用Session防止表單重復(fù)提交)

在服務(wù)器端生成一個唯一的隨機標識號token,同時在當前用戶的Session域中保存這個Token。然后將Token發(fā)送到客戶端的Form表單中,在Form表單中使用隱藏域來存儲這個Token,表單提交的時候連同這個Token一起提交到服務(wù)器端,然后在服務(wù)器端判斷客戶端提交上來的Token與服務(wù)器端生成的Token是否一致,如果不一致,那就是重復(fù)提交了,此時服務(wù)器端就可以不處理重復(fù)提交的表單。如果相同則處理表單提交,處理完后清除當前用戶的Session域中存儲的標識號。

在下列情況下,服務(wù)器程序?qū)⒕芙^處理用戶提交的表單請求:

存儲Session域中的Token與表單提交的Token不同。

當前用戶的Session中不存在Token。

用戶提交的表單數(shù)據(jù)中沒有Token。

1、創(chuàng)建FormServlet,用于生成Token(令牌)和跳轉(zhuǎn)到form.jsp頁面

package xdp.gacl.session;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class FormServlet extends HttpServlet {

? ? private static final long serialVersionUID = -884689940866074733L;

? ? public void doGet(HttpServletRequest request, HttpServletResponse response)

? ? ? ? ? ? throws ServletException, IOException {

? ? ? ? String token = TokenProccessor.getInstance().makeToken();//創(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);

? ? }

}

2、在form.jsp中使用隱藏域來存儲Token

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>form表單</title>

</head>

<body>

? ? <form action="${pageContext.request.contextPath}/servlet/DoFormServlet" method="post">

? ? ? ? <%--使用隱藏域存儲生成的token--%>

? ? ? ? <%--

? ? ? ? ? ? <input type="hidden" name="token" value="<%=session.getAttribute("token") %>">

? ? ? ? --%>

? ? ? ? <%--使用EL表達式取出存儲在session中的token--%>

? ? ? ? <input type="hidden" name="token" value="${token}"/>

? ? ? ? 用戶名:<input type="text" name="username">

? ? ? ? <input type="submit" value="提交">

? ? </form>

</body>

</html>

3、DoFormServlet處理表單提交

package xdp.gacl.session;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class DoFormServlet extends HttpServlet {

? ? public void doGet(HttpServletRequest request, HttpServletResponse response)

? ? ? ? ? ? ? ? throws ServletException, IOException {

? ? ? ? ? ? boolean b = isRepeatSubmit(request);//判斷用戶是否是重復(fù)提交

? ? ? ? ? ? if(b==true){

? ? ? ? ? ? ? ? System.out.println("請不要重復(fù)提交");

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? ? ? request.getSession().removeAttribute("token");//移除session中的token

? ? ? ? ? ? System.out.println("處理用戶提交請求??!");

? ? ? ? }


? ? ? ? /**

? ? ? ? * 判斷客戶端提交上來的令牌和服務(wù)器端生成的令牌是否一致

? ? ? ? * @param request

? ? ? ? * @return

? ? ? ? *? ? ? ? true 用戶重復(fù)提交了表單

? ? ? ? *? ? ? ? false 用戶沒有重復(fù)提交表單

? ? ? ? */

? ? ? ? private boolean isRepeatSubmit(HttpServletRequest request) {

? ? ? ? ? ? String client_token = request.getParameter("token");

? ? ? ? ? ? //1、如果用戶提交的表單數(shù)據(jù)中沒有token,則用戶是重復(fù)提交了表單

? ? ? ? ? ? if(client_token==null){

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? }

? ? ? ? ? ? //取出存儲在Session中的token

? ? ? ? ? ? String server_token = (String) request.getSession().getAttribute("token");

? ? ? ? ? ? //2、如果當前用戶的Session中不存在Token(令牌),則用戶是重復(fù)提交了表單

? ? ? ? ? ? if(server_token==null){

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? }

? ? ? ? ? ? //3、存儲在Session中的Token(令牌)與表單提交的Token(令牌)不同,則用戶是重復(fù)提交了表單

? ? ? ? ? ? if(!client_token.equals(server_token)){

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? }


? ? ? ? ? ? return false;

? ? ? ? }

? ? public void doPost(HttpServletRequest request, HttpServletResponse response)

? ? ? ? ? ? throws ServletException, IOException {

? ? ? ? doGet(request, response);

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容