问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javaweb防止表单重复提交的几种解决方案2

发布网友 发布时间:2024-03-07 22:36

我来回答

1个回答

热心网友 时间:2024-08-19 20:04

1.js方法解决:关于js方法解决就是说通过js动态控制提交按钮不能多次点击,或者多次点击不起作用。

方案一:通过设立标识使表单不能重复提交:

var flag=true;    function Sub(){        if(flag){
flag = false;
document.form1.onsubmit();
}
}

方案二:一次点击后使得提交按钮变成不可用

<input type="button" value="login" onclick="this.disabled=true;this.form.submit();" />

总的来说,js解决方案是基本可以防止重复点击提交按钮造成的重复提交问题,但是前进后退操作,或者F5刷新页面等问题并不能得到解决。

最重要的一点,前端的代码只能防止不懂js的用户,如果碰到懂得js的编程人员,那js方法就没用了。

2.设置HTTP报头,控制表单缓存,使得所控制的表单不缓存信息,这样用户就无法通过重复点击按钮去重复提交表单。

<meta http-equiv="Cache-Control" content="no-cache, must-revalidate">

但是这样做也有局限性,用户在提交页面点击刷新也会造成表单的重复提交。

3.通过PRG设计模式(用来防止F5刷新重复提交表单):

PRG模式通过响应页面Header返回HTTP状态码进行页面跳转替代响应页面跳转过程。具体过程如下:

客户端用POST方法请求服务器端数据变更,服务器对客户端发来的请求进行处理重定向到另一个结果页面上,客户端所有对页面的显示请求都用get方法告知服务器端,这样做,后退再前进或刷新的行为都发出的是get请求,不会对server产生任何数据更改的影响。

但此方法也不能防止所有情况:例如用户多次点击提交按钮;恶意用户避开客户端预防多次提交手段,进行重复提交请求;

以上都说的是在客户端如何防止表单重复提交,下面说一下服务器端有哪些可行的方法。

4.如果是注册或存入数据库的操作,可以通过在数据库中字段设立唯一标识来解决,这样在进行数据库插入操作时,因为每次插入的数据都相同,数据库会拒绝写入。这样也避免了向数据库中写入垃圾数据的情况,同时也解决了表单重复提交问题。

但是这种方法在业务逻辑上感觉是说不过去的,本来该有的逻辑,缺因为数据库该有的设计隐藏了。而且这种方法也有一定的功能局限性,只适用于某系特定的插入操作。

5.session方法:

在struts框架中防止表单重复提交的方法是生成Token存入session,以此判断表单是否是第一次提交。以下给大家解释一下运行流程。

首先客户端请求服务器中的表单,服务器将客户机所请求的表单发给客户机同时发送一个特殊的随机数(Token)作为表单号存在表单的隐藏域中(type=hidden),并且存入服务器端的session中。
在客户端填写完表单内容向服务器提交时,同时也将隐藏域中的表单号发给服务器端,服务器端此时会检测服务器端的表单号是否存在,如果存在,则进行提交操作,并删除此表单号,否则,服务器视为客户机端重复提交表单,不予操作。

此处贴出生成Token的代码(保证随机数的独一无二性):

class Token{    private Token(){}    private static Token instance = new Token();
public Token getinstance(){        return instance;
}
//随机数发生器
public String getToken(){
String token = System.currentTimeMillis() + "" + new Random().nextInt();//获得毫秒数加随机数
try {
MessageDigest md = MessageDigest.getInstance("md5");            byte[] md5 = md.digest(token.getBytes());
BASE64Encoder base = new BASE64Encoder();
base.encode(md5);

} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}

}

要强调的是,利用session方法解决表单重复问题是十分完美的,基本上可以应对各种重复提交问题。

但!是不是之前在客户端防止表单重复提交的种种方法就不使用了呢?

答案是否定的,我们需要多种方法混合使用才能达到最好的效果,也许有人会问,不是说session方法基本可以应对各种重复提交问题了吗?

这里我们所说的达到最好效果指的是,给用户更好地体验,例如用户点击了提交按钮,这时将按钮变为不可用的,用以告诉用户你已经提交内容了,不可重复提交。还有如果无论什么情况都用session防止表单重复提交问题,反而无形的增加了服务器端的负担。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
从焦作市到郑州快递一个羽毛球拍需用多少钱 iPhone X还能坚挺两年,升级到ios 15发热严重要靠红魔冰磁散热器 Peltier Module散热方式 一加18W冰点散热背夹-超强散热,极速降温 2015年春晚有哪些明星 新闻 如何评价央视主持人朱军?以及如何评价朱军所主持的《艺术 纯粮食白酒品牌大全,让你喝得放心(真正的纯粮食白酒有哪些品牌)_百度... ...工作单位要辞退并提出会给出相应赔偿,但合同马上到期,如到期后... ABC外语培训学校ABC教育集团总裁——刘成 abc是国产品牌吗?口碑如何? javaweb开发时遇到的一个问题 大家知道这是什么植物吗?在陕西定边县的山沟沟里头找到的,当地人叫... 朋友送给我一色植物的果核说是藏灵果,可泡洒喝能补肾,但在网上查不到... 怎么让EXCEL上面一排一直显示,无论没到下面的哪个位置,上面一行一直... 也妆成一瞬的红颜了中红颜的意思是 头白的芦苇也妆成一瞬的红颜,出处 白头的芦苇也妆成一瞬的红颜这句诗的理解 2009农历十一月二十九生日,阳历应该是多少号 今年教师资格证笔试成绩有效期延长了吗?5 教师资格证笔试成绩保留几年呀,今年考试时间延期,需要补考吗 公积金贷款年限及额度怎么计算14 你好,想咨询一下,报考教师资格证可以先报考一科吗? 跑完步可以马上洗澡吗229 跑步后多久才能洗澡?6 早上跑完步,需要休息多久才可以洗澡?3 跑完步后可以马上洗澡吗?746 跑步后多久才合适洗澡?337 跑完步后过多少分钟可以坐下洗澡喝水。61 龙井茶是什么茶什么是龙井茶 iPhone 7,越狱后手机出故障了。刷机之后数据都没了 在eclipse中javaweb项目重命名后,为何发布到to...91 世界上最长的披萨饼 我的被注销了,怎么找回啊?那个号对我很重要! 用什么仪器看肾结石最清楚,在输尿管下端有一颗结石,但B超看不清楚,请 ... B超,CT,造影都能看到肾结石,但是医生在我身上插上软镜后,找了半个小 ... 想去厦门十日游,有哪些好玩的夜市和购物街区推荐? 多个客户请求同一个Servlet时WEB服务器如何处理2 男人最反感女友送什么礼物? 男生十大讨厌的礼物.! douta2已断开与服务器的连接 STEAM用户ID在这个服... 用户拼服务器好的而服务器拼用户不好。 徐建勇陶瓷杯有收藏价值吗 恋爱两年,男友不想结婚,该不该彻底放弃 丰富的情感生活,有影响到射手座的男孩子吗? 为什么我的word07新建文档,默认在左边? 南阳中专学校有哪些 声东击什么猜地名 WORD文档最后一页左上角出现文本框,请问怎么在不影响正文格... word最后一页空白页为什么总是删不掉?2906 复制出的word文件总是带文本框,还删除不了,怎么办7