我想实现每隔1s自动提交一次表单,不同手动提交,并且把服务器接收表单处理的结果显示到指定的地方,怎么实现呢?

本类周下载排行
本类月下载排行
热门关键词
网页自动提交监控工具 V5.10 官方版
网页自动提交表单|软件简介 Soft Introduction
网页自动提交监控工具是一款能够释放用户双手的网页自动提交表单软件,可以自动填写网页表单并且监控提交后内容是否成功,重要的是还支持验证码自动填写,适合批量提交网页。【基本介绍】网页自动提交表单支持验证码自动填写,填写完毕后自动提交。定时提交可实现在无人值守时自动填表并提交网页。完全模拟手工操作,展示实时页面及整个提交过程。程序可后台运行,完全不影响键盘鼠标操作。【软件特点】1、支持各种文本框、列表框、选择框填写,多任务多操作连续提交,实现无人值守。2、自动填写表单项,填写内容可以是固定值、从字典文件中读取的内容或验证图片的识别结果。3、支持按钮提交、表单提交以及自定义脚本等多种提交方式交。4、支持网页脚本删除、替换、注入、执行等。5、提交时显示实时速度,自动统计提交效果与流量。6、支持代理服务器,换IP提交。可导入大量免费代理服务器,可随机使用或环使用代理服务器,自动对代理服务器使用情况进行统计管理。7、支持验证码手工快速录入,支持验证码云识别自动输入。8、网页内容变化监控,包括脚本执行产生的变化。9、网页内容关键字监控,同时监控多个关键字。10、网页HTML元素级监控,同时监控多个元素,进行数据比较。11、网络故障监控,本地网络故障时报警。12、提交失败监控,网站服务器出现问题,或网页打不开时报警。13、监控报警处置方式:弹出提示对话框;声音提示;任务中止;启动新任务;启动外部处置程序;保存当前页面;程序关闭;自动关机。
如果您觉得此软件好,请
如果您觉得此软件差,请
进入 →网页自动提交监控工具 V5.10 官方版← 下载列表 Soft Download URL
网页自动提交监控工具 V3.82 官方版高速下载地址:其它下载地址:
相关软件 Related Software
注意事项 Attentions
如果您发现该软件不能下载,请.
为了保证您快速的下载,推荐使用[]等专业工具下
为确保所下软件能正常使用,请使用[]或以上版
本解压本站软件.
站内软件包含破解及注册码均由网上搜集,若无意中侵犯到您的权利,敬请来信
如果下载回来的部分压缩包需要解压密码的话,解压密码就是:
本站设有电信网通多台服务器负载均衡,如果出现无法下载请稍后再试一下!
服务器赞助商 Server Provider1177人阅读
1.什么叫表单重复提交:
&&&& 所谓表单重复提交,是指用户通过多次点击提交按钮或多次刷新表单提交页面等造成用户表单重复提交的现象
2.表单重复提交有哪些情况:
&&&& (1)用户在程序提交表单的时间段里多次提交表单
&&&& (2)重复刷新提交后的表单
&&&& (3)用户点击浏览器回退按钮,然后再次提交
3.如果解决表单重复提交:
&&& (1)方法1:客户端防表单重复提交:& 一般通过js代码防止第一种情况的发生,对于第二种和第三种的情况很难避免,并且稍微有经验的用户可以通过去掉页面js生成自己的html页面来访问服务器,这样客户端的防表单重复提交只能“防君子不能防小人”,并且可以增强用户体验感。
&&&& (2)方法2:服务器端session防表单重复提交:一般是利用令牌的原理来实现表单重复提交的,具体做法:
&&&&&&&&&& A. 对于用户每一次访问表单页面,均先经过CreateFormServlet的Servlet,其作用是在跳转表单页面之前,由BASE64Encoder类生成一个唯一的字符串,即表单号,并保存在session域中.
&&&&&&&&&& B.然后用户提交表单时,带着表单号,先验证客户端提交过来的表单号和session域中的表单号是否相同,如果不同则证明是重复提交,如果相同,则证明是第一次提交,并将表单号从session域中移除。
&4.例子程序:
&regist.jsp
&%@ page language=&java& import=&java.util.*& pageEncoding=&utf-8&%&
&!DOCTYPE HTML PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN&&
&script type=&text/javascript&&
/*虽然客户端防表单重复提交,有很多漏洞,但是为了提高客户体验感,一把是客户端和服务器配合防表单重复提交,
客户端防重复提交的漏洞:1.客户复制源代码,去掉此js脚本,生成自己的html页面,然后提交
2.重复刷新提交后的表单
3.用户点击浏览器回退按钮,然后再次提交
客户端防重复提交的代码:
var isCommited =
function dosubmit(){
if(!isCommited){
isCommited =
//或者使&注册&按钮点击一次后不可用
function dosubmit1(){
var input = document.getElementById(&submit&);
input.disabled=&disabled&;
&form action=&/CookieAndSession/servlet/regist& method=&post& onsubmit=&return dosubmit()&&
用户名:&input type=&text& name=&username& value=&aaa&&&br/&
&input type=&hidden& name=&c_token& value=&${token}&&
&input id=&submit& type=&submit& value=&注册& &
CreateFormServlet.java& && url-pattern:& /servlet/createform
package edu.
import java.io.IOE
import java.security.MessageD
import java.security.NoSuchAlgorithmE
import java.util.R
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import sun.misc.BASE64E
public class CreateFormServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//产生表单号
String token = TokenProcessor.getInstance().generateToken();
request.getSession().setAttribute(&token&, token);
request.getRequestDispatcher(&/regist.jsp&).forward(request, response);
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
class TokenProcessor{
private static TokenProcessor token = new TokenProcessor();
private TokenProcessor(){}
public static TokenProcessor getInstance(){
public String generateToken(){
String token = System.currentTimeMillis()+new Random().nextInt()+&&;
MessageDigest md = MessageDigest.getInstance(&md5&);
byte[] md5 = md.digest(token.getBytes());
//base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(md5);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
RegistServlet.java&& & url-pattern:& /servlet/regist
package edu.
import java.io.IOE
import java.io.PrintW
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
public class RegistServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding(&utf-8&);
response.setContentType(&text/charset=utf-8&);
PrintWriter out = response.getWriter();
boolean isValid = tokenValidate(request);
if(!isValid){
out.print(&&script&alert('请不要重复提交,程序正在处理!');&/script&&);
out.println(&正在向数据库注册用户信息!&);
private boolean tokenValidate(HttpServletRequest request) {
String c_token = request.getParameter(&c_token&);
String s_token = (String) request.getSession().getAttribute(&token&);
//防止用户自定义html
if(c_token==null)
if (s_token==null)
if (!s_token.equals(c_token))
request.getSession().removeAttribute(&token&);
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
程序不能直接进入regist.jsp页面,只能通过http://localhost:8080/CookieAndSession/servlet/createform进入CreateFormServlet.java通过此Servlet跳转至注册页面
此时http://localhost:8080/CookieAndSession/servlet/createform页面原代码如下:
这样就可以解决以上三种可能出现的表单重复提交问题!
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:449231次
积分:6000
积分:6000
排名:第2172名
原创:161篇
转载:286篇
评论:37条
(1)(1)(7)(6)(8)(8)(5)(6)(12)(9)(27)(12)(138)(16)(24)(3)(1)(1)(1)(1)(11)(28)(26)(43)(53) 上传我的文档
 下载
 收藏
我是一名资深的网络营销高手,从事网络营销有5年工作经验,经过百度公司,阿里巴巴公司系统的培训。
 下载此文档
正在努力加载中...
基于SOA的保险表单自动化处理系统的设计及实实现
下载积分:1250
内容提示:基于SOA的保险表单自动化处理系统的设计及实实现
文档格式:PDF|
浏览次数:2|
上传日期: 16:16:23|
文档星级:
该用户还上传了这些文档
基于SOA的保险表单自动化处理系统的设计及实实现
官方公共微信SSH系统中怎样解决刷新重复提交-Java/JavaEE-java-电脑编程网SSH系统中怎样解决刷新重复提交-Java/JavaEE作者:webrobot 和相关&&插入一个数据,从一个页面中,进入user.do的insert,插入成功,跳转倒ok.页面。提交插入成功之后,显示user.do路径,显示ok.jsp页面。 若这时候刷新,则会重复插入数据。1、怎样解决这时候的刷新不会重复提交2、怎样不用js代码,预防浏览器后退,若后退则提示错误或者跳转倒某页。------回答---------------其他回答(5分)---------你可以google下struts的Token机制------其他回答(5分)---------同步令牌器------其他回答(5分)---------struts-config.xml里可以配置跳转时是内部跳还是外部跳,你也可以像楼上说的。------其他回答(5分)---------引用 1 楼 s_liangchao1s 的回复:你可以google下struts的Token机制正解------其他回答(5分)---------struts1和struts2都有token机制,google一下,很多------其他回答(5分)---------token令牌或做个中转面页------其他回答(47分)---------1,页面脚本实现,当提交过一次表单后,将提交按钮变为不可用,就不会再触发写入的操作. 2,解发写入操作的action之后,调用formbean中的resetform方法,将form中的数据库清空,当然提交form中数据库有一定限制时会起作用,允许向数据库写入null时,就不起作用了. 3,解发写入数据库操作的action之后,不再用forward的方法,转发页面请求,直接采用sendridect...相关文章:
& struts token解决用户重复提交问题详解& struts的重复提交源码分析& IE浏览器重复提交的问题!& 推荐圈子: GT-Grid& 更多相关推荐 Struts的Token(令牌)机制能够很好的解决表单重复提交的问题,基本原理是:端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和端的令牌不一致,从而有效地防止了重复提交的发生。& & 这时其实也就是两点,第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样的,通过隐藏字段来保存,保存的形式如: 〈input type=&hidden& name=&org..struts.taglib.html.TOKEN& value=&6aafd996c4cae&〉,这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。& & 在Action中的add方法中,我们需要将Token值明确的要求保存在页面中,只需增加一条语句:saveToken(request);,如下所示:& & public ActionForward add(ActionMapping mapping, ActionForm form,& & HttpServletRequest request, HttpServletResponse response)& & //前面的处理省略& & saveToken(request);& & return mapping.findForward(&add&);& & }在Action的insert方法中,我们根据表单中的Token值与服务器端的Token值比较,如下所示:& & public ActionForward insert(ActionMapping mapping, ActionForm form,& & HttpServletRequest request, HttpServletResponse response)& & if (isTokenValid(request, true)) {& & // 表单不是重复提交& & //这里是保存数据的代码& & } else {& & //表单重复提交& & saveToken(request);& & //其它的处理代码& & }& & }& & 其实使用起来很简单,举个最简单、最需要使用这个的例子:& & 一般控制重复提交主要是用在对数据库操作的控制上,比如插入、更新、删除等,由于更新、删除一般都是通过id来操作(例如:updateXXXById, removeXXXById),所以这类操作控制的意义不是很大(不排除个别现象),重复提交的控制也就主要是在插入时的控制了。& & 先说一下,我们目前所做项目的情况:& & 目前的项目是用Struts+Spring+Ibatis,页面用jstl,Struts复杂View层,Spring在Service层提供事务控制,Ibatis是用来代替JDBC,所有页面的访问都不是直接访问jsp,而是访问Structs的Action,再由Action来Forward到一个Jsp,所有针对数据库的操作,比如取数据或修改数据,都是在Action里面完成,所有的Action一般都继承BaseDispatchAction,这个是自己建立的类,目的是为所有的Action做一些统一的控制,在Struts层,对于一个功能,我们一般分为两个Action,一个Action里的功能是不需要调用Struts的验证功能的(常见的方法名称有add,edit,remove,view,list),另一个是需要调用Struts的验证功能的(常见的方法名称有insert,update)。& & 就拿论坛发贴来说吧,论坛发贴首先需要跳转到一个页面,你可以填写帖子的主题和内容,填写完后,单击“提交”,贴子就发表了,所以这里经过两个步骤:& & 1、转到一个新增的页面,在Action里我们一般称为add,例如:& & public ActionForward add(ActionMapping mapping, ActionForm form,& & HttpServletRequest request, HttpServletResponse response)& & throws Exception {& & //这一句是输出调试信息,表示代码执行到这一段了& & log.debug(&:: action - subject add&);& & //your code here& & //这里保存Token值& & saveToken(request);& & //跳转到add页面,在Structs-config.xml里面定义,例如,跳转到subjectAdd.jsp& & return mapping.findForward(&add&);& & }& & 2、在填写标题和内容后,选择 提交 ,会提交到insert方法,在insert方法里判断,是否重复提交了。& & public ActionForward insert(ActionMapping mapping, ActionForm form,& & HttpServletRequest request, HttpServletResponse response){& & if (isTokenValid(request, true)) {& & // 表单不是重复提交& & //这里是保存数据的代码& & } else {& & //表单重复提交& & saveToken(request);& & //其它的处理代码& & }& & }& & 下面更详细一点(注意,下面所有的代码使用全角括号):& & 1、你想发贴时,点击“我要发贴”链接的代码可以里这样的:& & 〈html:link action=&subject.do?method=add&〉我要发贴〈/html:link〉& & subject.do 和 method 这些在struct-config.xml如何定义我就不说了,点击链接后,会执行subject.do的add方法,代码如上面说的,跳转到subjectAdd.jsp页面。页面的代码大概如下:& & 〈html:form action=&subjectForm.do?method=insert&〉& & 〈html:text property=&title& /〉& & 〈html:textarea property=&content& /〉& & 〈html:submit property=&发表& /〉& & 〈html:reset property=&重填& /〉& & 〈html:form〉& & 如果你在add方法里加了“saveToken(request);”这一句,那在subjectAdd.jsp生成的页面上,会多一个隐藏字段,类似于这样〈input type=&hidden& name=&org..struts.taglib.html.TOKEN& value=&6aafd996c4cae&〉,& & 2、点击发表后,表单提交到subjectForm.do里的insert方法后,你在insert方法里要将表单的数据插入到数据库中,如果没有进行重复提交的控制,那么每点击一次浏览器的刷新按钮,都会在数据库中插入一条相同的记录,增加下面的代码,你就可以控制用户的重复提交了。& & if (isTokenValid(request, true)) {& & // 表单不是重复提交& & //这里是保存数据的代码& & } else {& & //表单重复提交& & saveToken(request);& & //其它的处理代码& & }& & 注意,你必须在add方法里使用了saveToken(request),你才能在insert里判断,否则,你每次保存操作都是重复提交。& & 记住一点,Struts在你每次访问Action的时候,都会产生一个令牌,保存在你的Session里面,如果你在Action里的函数里面,使用了saveToken(request);,那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。& & 如果你在你Action的方法里使用了isTokenValid,那么Struts会将你从你的request里面去获取这个令牌值,然后和Session里的令牌值做比较,如果两者相等,就不是重复提交,如果不相等,就是重复提交了。& & 由于我们项目的所有Action都是继承自BaseDispatchAction这个类,所以我们基本上都是在这个类里面做了表单重复提交的控制,默认是控制add方法和insert方法,如果需要控制其它的方法,就自己手动写上面这些代码,否则是不需要手写的,控制的代码如下:& & public abstract class BaseDispatchAction extends BaseAction {& & protected ActionForward perform(ActionMapping mapping, ActionForm form,& & HttpServletRequest request, HttpServletResponse response)& & throws Exception {& & String parameter = mapping.getParameter();& & String name = request.getParameter(parameter);& & if (null == name) { //如果没有指定 method ,则默认为 list& & name = &list&;& & }& & if (&add&.equals(name)) {& & if (&add&.equals(name)) {& & saveToken(request);& & }& & } else if (&insert&.equals(name)) {& & if (!isTokenValid(request, true)) {& & resetToken(request);& & saveError(request, new ActionMessage(&error.repeatSubmit&));& & log.error(&重复提交!&);& & return mapping.findForward(&error&);& & }& & }& & return dispatchMethod2(mapping, form, request, response, name);& & }& & }
------其他回答(5分)---------楼上说的对。struts的Token机制------其他回答(5分)---------除了用token之外,你跳转的时候不要用转发,用重定向------其他回答(5分)---------添加完之后重定向到一个显示的Action中------其他回答(8分)---------7楼已经很详细了------回答---------------其他回答(5分)---------你可以google下struts的Token机制------其他回答(5分)---------同步令牌器------其他回答(5分)---------struts-config.xml里可以配置跳转时是内部跳还是外部跳,你也可以像楼上说的。------其他回答(5分)---------引用 1 楼 s_liangchao1s 的回复:你可以google下struts的Token机制正解------其他回答(5分)---------struts1和struts2都有token机制,google一下,很多------其他回答(5分)---------token令牌或做个中转面页------其他回答(47分)---------
1,页面脚本实现,当提交过一次表单后,将提交按钮变为不可用,就不会再触发写入数据库的操作. 2,解发写入数据库操作的action之后,调用formbean中的resetform方法,将form中的数据库清空,当然提交form中数据库有一定限制时会起作用,允许向数据库写入null时,就不起作用了. 3,解发写入数据库操作的action之后,不再用forward的方法,转发页面请求,直接采用sendridect...相关文章:
& struts token解决用户重复提交问题详解& struts的重复提交源码分析& IE浏览器重复提交的问题!& 推荐圈子: GT-Grid& 更多相关推荐 Struts的Token(令牌)机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。&   &   这时其实也就是两点,第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样的,通过隐藏字段来保存,保存的形式如: 〈input type=&hidden& name=&org.apache.struts.taglib.html.TOKEN& value=&6aafd996c4cae&〉,这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。&   &   在Action中的add方法中,我们需要将Token值明确的要求保存在页面中,只需增加一条语句:saveToken(request);,如下所示:&   &   public ActionForward add(ActionMapping mapping, ActionForm form,&   &   HttpServletRequest request, HttpServletResponse response)&   &   //前面的处理省略&   &   saveToken(request);&   &   return mapping.findForward(&add&);&   &   }在Action的insert方法中,我们根据表单中的Token值与服务器端的Token值比较,如下所示:&   &   public ActionForward insert(ActionMapping mapping, ActionForm form,&   &   HttpServletRequest request, HttpServletResponse response)&   &   if (isTokenValid(request, true)) {&   &   // 表单不是重复提交&   &   //这里是保存数据的代码&   &   } else {&   &   //表单重复提交&   &   saveToken(request);&   &   //其它的处理代码&   &   }&   &   }&   &   其实使用起来很简单,举个最简单、最需要使用这个的例子:&   &   一般控制重复提交主要是用在对数据库操作的控制上,比如插入、更新、删除等,由于更新、删除一般都是通过id来操作(例如:updateXXXById, removeXXXById),所以这类操作控制的意义不是很大(不排除个别现象),重复提交的控制也就主要是在插入时的控制了。&   &   先说一下,我们目前所做项目的情况:&   &   目前的项目是用Struts+Spring+Ibatis,页面用jstl,Struts复杂View层,Spring在Service层提供事务控制,Ibatis是用来代替JDBC,所有页面的访问都不是直接访问jsp,而是访问Structs的Action,再由Action来Forward到一个Jsp,所有针对数据库的操作,比如取数据或修改数据,都是在Action里面完成,所有的Action一般都继承BaseDispatchAction,这个是自己建立的类,目的是为所有的Action做一些统一的控制,在Struts层,对于一个功能,我们一般分为两个Action,一个Action里的功能是不需要调用Struts的验证功能的(常见的方法名称有add,edit,remove,view,list),另一个是需要调用Struts的验证功能的(常见的方法名称有insert,update)。&   &   就拿论坛发贴来说吧,论坛发贴首先需要跳转到一个页面,你可以填写帖子的主题和内容,填写完后,单击“提交”,贴子就发表了,所以这里经过两个步骤:&   &   1、转到一个新增的页面,在Action里我们一般称为add,例如:&   &   public ActionForward add(ActionMapping mapping, ActionForm form,&   &   HttpServletRequest request, HttpServletResponse response)&   &   throws Exception {&   &   //这一句是输出调试信息,表示代码执行到这一段了&   &   log.debug(&:: action - subject add&);&   &   //your code here&   &   //这里保存Token值&   &   saveToken(request);&   &   //跳转到add页面,在Structs-config.xml里面定义,例如,跳转到subjectAdd.jsp&   &   return mapping.findForward(&add&);&   &   }&   &   2、在填写标题和内容后,选择 提交 ,会提交到insert方法,在insert方法里判断,是否重复提交了。&   &   public ActionForward insert(ActionMapping mapping, ActionForm form,&   &   HttpServletRequest request, HttpServletResponse response){&   &   if (isTokenValid(request, true)) {&   &   // 表单不是重复提交&   &   //这里是保存数据的代码&   &   } else {&   &   //表单重复提交&   &   saveToken(request);&   &   //其它的处理代码&   &   }&   &   }&   &   下面更详细一点(注意,下面所有的代码使用全角括号):&   &   1、你想发贴时,点击“我要发贴”链接的代码可以里这样的:&   &   〈html:link action=&subject.do?method=add&〉我要发贴〈/html:link〉&   &   subject.do 和 method 这些在struct-config.xml如何定义我就不说了,点击链接后,会执行subject.do的add方法,代码如上面说的,跳转到subjectAdd.jsp页面。页面的代码大概如下:&   &   〈html:form action=&subjectForm.do?method=insert&〉&   &   〈html:text property=&title& /〉&   &   〈html:textarea property=&content& /〉&   &   〈html:submit property=&发表& /〉&   &   〈html:reset property=&重填& /〉&   &   〈html:form〉&   &   如果你在add方法里加了“saveToken(request);”这一句,那在subjectAdd.jsp生成的页面上,会多一个隐藏字段,类似于这样〈input type=&hidden& name=&org.apache.struts.taglib.html.TOKEN& value=&6aafd996c4cae&〉,&   &   2、点击发表后,表单提交到subjectForm.do里的insert方法后,你在insert方法里要将表单的数据插入到数据库中,如果没有进行重复提交的控制,那么每点击一次浏览器的刷新按钮,都会在数据库中插入一条相同的记录,增加下面的代码,你就可以控制用户的重复提交了。&   &   if (isTokenValid(request, true)) {&   &   // 表单不是重复提交&   &   //这里是保存数据的代码&   &   } else {&   &   //表单重复提交&   &   saveToken(request);&   &   //其它的处理代码&   &   }&   &   注意,你必须在add方法里使用了saveToken(request),你才能在insert里判断,否则,你每次保存操作都是重复提交。&   &   记住一点,Struts在你每次访问Action的时候,都会产生一个令牌,保存在你的Session里面,如果你在Action里的函数里面,使用了saveToken(request);,那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。&   &   如果你在你Action的方法里使用了isTokenValid,那么Struts会将你从你的request里面去获取这个令牌值,然后和Session里的令牌值做比较,如果两者相等,就不是重复提交,如果不相等,就是重复提交了。&   &   由于我们项目的所有Action都是继承自BaseDispatchAction这个类,所以我们基本上都是在这个类里面做了表单重复提交的控制,默认是控制add方法和insert方法,如果需要控制其它的方法,就自己手动写上面这些代码,否则是不需要手写的,控制的代码如下:&   &   public abstract class BaseDispatchAction extends BaseAction {&   &   protected ActionForward perform(ActionMapping mapping, ActionForm form,&   &   HttpServletRequest request, HttpServletResponse response)&   &   throws Exception {&   &   String parameter = mapping.getParameter();&   &   String name = request.getParameter(parameter);&   &   if (null == name) { //如果没有指定 method ,则默认为 list&   &   name = &list&;&   &   }&   &   if (&add&.equals(name)) {&   &   if (&add&.equals(name)) {&   &   saveToken(request);&   &   }&   &   } else if (&insert&.equals(name)) {&   &   if (!isTokenValid(request, true)) {&   &   resetToken(request);&   &   saveError(request, new ActionMessage(&error.repeatSubmit&));&   &   log.error(&重复提交!&);&   &   return mapping.findForward(&error&);&   &   }&   &   }&   &   return dispatchMethod2(mapping, form, request, response, name);&   &   }&   &   }
------其他回答(5分)---------楼上说的对。struts的Token机制------其他回答(5分)---------除了用token之外,你跳转的时候不要用转发,用重定向------其他回答(5分)---------添加完之后重定向到一个显示的Action中------其他回答(8分)---------7楼已经很详细了相关资料:|||||||SSH系统中怎样解决刷新重复提交-Java/JavaEE来源网络,如有侵权请告知,即处理!编程Tags:                &                    

我要回帖

更多关于 表单提交服务器实例 的文章

 

随机推荐