防止重复提交的前后台实现

本文探讨了如何防止网页表单的重复提交问题,包括前端通过禁用按钮和利用JavaScript控制,以及后端通过令牌验证机制来确保唯一提交。详细介绍了后端的HandlerServlet类和TokenProcessor类的工作原理,特别是MessageDigest在生成唯一令牌中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在日常生活中,网速不好的时候,经常出现提交表单后网页没有跳转或一直在跳转中,这时可能急性子的用户就会不停地按提交按钮,导致重复提交。重复提交会加重服务器压力。今天我们就来讨论下怎么防止重复提交

一.前台防止重复提交

<form action="about:blank" method="post"  onsubmit ="getElementById('submitInput').disabled=true;return true;"  target="_blank"> 
			<input type="submit" value="提交" id="submitInput" onclick="this.value='提交ing···';"/> 
		</form> 
通过onsubmit方法使表单提交后按钮变为disabled,通过按钮添加onClick事件使按钮文字变为“提交ing···”,表示正在提交中。

效果:

提交前:

提交后:



尽管这样,但用户有时会耐不住性子刷新页面或者按后退重新提交,又或者浏览器禁止javascript,那就要用后台来防止重复提交了。

二.后台防止重复提交

<form method="post" action="handler" name="theForm">
            <table>
                <tr>
                    <td>用户名:</td>
                    <td><input type="text" name="username"></td>
                </tr>
                <tr>
                    <td>密码:</td>
    	            <td>
    	                <input type="password" name="password">
                        <input type="hidden" name="org.sunxin.token" value="<%=token%>"/>
    	            </td>
    	        </tr>
    	        <tr>
    	            <td><input type="reset" value="重填"></td>
    	            <td><input type="button" name="btnSubmit" value="提交" onClick="checkSubmit();"/></td>
    	        </tr>
先写个表单,如上图,用隐藏表单记录token属性(注意隐藏域中的名字必须与下面令牌类定义的静态变量TOKEN_KEY一致)。当提交表单后,HandlerServlet程序会比较隐藏域中的值和Session域中的标志号,如果相同就处理表单数据,处理后就清除当前用户Session域中存储的标识符,如果不相同就会忽略表单请求。当重复提交表单时,当前Session域中会不存在相应的表单标识号。接下来要写一个名为TokenProcessor的令牌类:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * TokenProcessor类是一个单例类。
*/
public class TokenProcessor
{
    static final String TOKEN_KE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值