关于如何防止重复提交的问题, 求解答。。 情况是这样的。。我有一个方法 运行完毕大概需要30秒(里面有Thread.sleep)。方法如果运行到一半,我在按页面上的提交也就是说重新执行了这个action.请问如何防止要在方法运行完以后才能继续提交? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个拦截器查了下 是struts2的么。1有么。。 struts1也有的,但不叫拦截器,叫令牌 最好的办法还是使用TOKEN(令牌),当然页面按钮给它置灰最好不过了 也就是让这个submit失效,那怎样解决方法结束重新有效呢 Struts 1 中也有,就算使用 Servlet 也可以自行实现。 Struts自带的方式(令牌):服务器端发放一次性使用的令牌方式,服务器端给客户端每次请求发一个令牌,在客户端提交之后,检查令牌,如果这个令牌是第一次使用,就ok;否则,提示重复提交。 Action中有个几个相关方法: SaveToken(request):生成一个新的令牌,并保存到客户端的请求对象中。 IsTokenValid(request,true):检查客户端的令牌是否是第一次使用,并且使该令牌失效。 ResetToken(request):重置客户端的令牌。 1:提交页面前一个action this.saveToken(request); 2:提交页面 <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value= "<%=session.getAttribute("org.apache.struts.action.TOKEN")%>"/> 3:处理提交的action if(isTokenValid(request,true)){ //commonDataBean.executeUpdate(sql);//处理执行sql语句代码 resetToken(request); }else{ this.saveToken(request); } if (!isTokenValid(request, true)) { resetToken(request); saveError(request, new ActionMessage("error.repeatSubmit")); log.error("重复提交!"); return mapping.findForward("error"); } 问题是 我第一次进这个action 是正确的,正常情况下是return mapping.findForward("success"); 如果我在调用次这个action,触发令牌不正确,也就是说进入了else{},那else里也有个return,return mapping.findForward("error"); 那我想跳转的是success这个页面,可现在进了else的error页面,如何解决。。 其实我防止重复提交可以实现 代码如下:public ActionForward service_test_run(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { if (request.getSession().getAttribute("service_test_run2") == null) { request.getSession().setAttribute("service_test_run2", "service_test_run2"); ………………………………(执行代码)…………………… request.getSession().removeAttribute("service_test_run2"); return mapping.findForward("service_test_over"); } else { ActionMessages messages = new ActionMessages(); messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.service_test_run")); saveMessages(request, messages); return mapping.findForward("service_test"); }return 到其他页面去了 要加锁 final HttpSession se = request.getSession(); boolean repeat = true; synchronized (se) { if (se.getAttribute("repeat") == null) { repeat = false; se.setAttribute("repeat", new byte[0]); } } if (repeat) { //重复提交 return; } try { // } finally { synchronized (se) { se.removeAttribute("repeat"); } } if (repeat) { //重复提交 return; }这里不也return出去了么应该最好写在js里,让提交都不行。。可该怎样写呢。我试过在session里放值,然后JS得到做判断,可只有当和页面有交互才能得到session的值。。 楼主,不要让我怀疑你的智商问题好吗?1。else就一定要进return error吗?随便你怎么处理啊,你可以写个提示我无比的晕2。你写的那个方法原理和我的类似,但是你少考虑了一个问题,你的这个方法不同用到2个地方比如提交功能A,要求不能重复提交,你保存了一个标识那么我想要功能B也要求不能重复提交,你又保存一个标识?很明显之保存一个是不行的 else 不管return 是不是error 我本来正常是returun A;然后else 除了也写return A;否则不可能进的是同一个页面对吧? 。无语,不知道你到底想要什么,我在教小学生?你当然可以写逻辑if(不是重复提交){ return SUCCESS;}else{ //重复提交,可以给用户提示 request.setAttribute("不可以重复提交"); return SUCCESS;} 是我自己问题。。我本来想else也到成功页面 那用户关掉ie 咋办。MB 其实我这个程序已经运行了。管他关不关。。是我自己一下子懵掉了。。 如果要考虑给客户好的体验,可以考虑用ajax请求,这样提示方便 java读取excel中日期格式问题!!! JPA和servlet整合的复合型工程 高手啊。。。救救偶吧。。 spring整合ibatis后如何配置适用于ibatis的事务管理器啊 做例子时遇到的问题 关于struts1.3的问题 对IndexedPropertyDescriptor类有点疑惑(请高手进来看看) 请问j2ee sdk 1.3中如何配置ms sql server的数据源? 有什么比较好的关于J2EE的教材? ejb部署问题,不解决它,中秋快乐哪里找,唉 Struts2 中文乱码问题(在上传文件时,textfield字段中文乱码) 提取数据库中的错误信息
这个拦截器查了下 是struts2的么。1有么。。
Action中有个几个相关方法:
SaveToken(request):生成一个新的令牌,并保存到客户端的请求对象中。
IsTokenValid(request,true):检查客户端的令牌是否是第一次使用,并且使该令牌失效。
ResetToken(request):重置客户端的令牌。
2:提交页面
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value= "<%=session.getAttribute("org.apache.struts.action.TOKEN")%>"/>
3:处理提交的action
if(isTokenValid(request,true)){
//commonDataBean.executeUpdate(sql);//处理执行sql语句代码
resetToken(request);
}else{
this.saveToken(request);
}
resetToken(request);
saveError(request, new ActionMessage("error.repeatSubmit"));
log.error("重复提交!");
return mapping.findForward("error");
}
问题是 我第一次进这个action 是正确的,正常情况下是return mapping.findForward("success");
如果我在调用次这个action,触发令牌不正确,也就是说进入了else{},那else里也有个return,
return mapping.findForward("error");
那我想跳转的是success这个页面,可现在进了else的error页面,如何解决。。
public ActionForward service_test_run(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
if (request.getSession().getAttribute("service_test_run2") == null) {
request.getSession().setAttribute("service_test_run2",
"service_test_run2");
………………………………(执行代码)……………………
request.getSession().removeAttribute("service_test_run2");
return mapping.findForward("service_test_over");
}
else { ActionMessages messages = new ActionMessages();
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.service_test_run"));
saveMessages(request, messages);
return mapping.findForward("service_test");
}return 到其他页面去了
boolean repeat = true;
synchronized (se) {
if (se.getAttribute("repeat") == null) {
repeat = false;
se.setAttribute("repeat", new byte[0]);
}
}
if (repeat) {
//重复提交
return;
}
try {
//
} finally {
synchronized (se) {
se.removeAttribute("repeat");
}
}
//重复提交
return;
}
这里不也return出去了么应该最好写在js里,让提交都不行。。可该怎样写呢。
我试过在session里放值,然后JS得到做判断,可只有当和页面有交互才能得到session的值。。
楼主,不要让我怀疑你的智商问题好吗?
1。else就一定要进return error吗?随便你怎么处理啊,你可以写个提示我无比的晕
2。你写的那个方法原理和我的类似,但是你少考虑了一个问题,你的这个方法不同用到2个地方
比如提交功能A,要求不能重复提交,你保存了一个标识
那么我想要功能B也要求不能重复提交,你又保存一个标识?很明显之保存一个是不行的
你当然可以写
逻辑
if(不是重复提交){
return SUCCESS;
}else{
//重复提交,可以给用户提示
request.setAttribute("不可以重复提交");
return SUCCESS;
}