struts2中action里面的方法被重复执行

叮咚叮咚叮叮咚 2015-05-08 10:14:43
半路接手的别人留下来的一个项目,以前搞java的经验也比较少,实在找不出问题出在哪里了,特意来请教

项目使用了struts2,BookAction中的send()方法是用户点击推送图书后交由后台向相应的邮箱发送图书,现在问题就是这个方法有时候会被重复执行两次而且中间没有时间间隔,我查看调用这个方法的引用有几处 链接,类似 <a href=book!send.do.............,没有表单重复提交的问题,而且重复执行也是偶发的,没看出有什么规律来

我尝试增加了以下两个解决方案但是都不行:
1.增加一个ArrayList检查如果是同一个用户10秒内推送同一本书就跳出这个方法
2.把用户推送记录存入数据库中,如果是10分钟之内重复推送的也跳出方法

不知有没有遇到过类似问题的兄弟,还请帮忙回复下

...全文
297 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
最终使用了个治标不治本的办法,测试了下重复的请求其中一个refer是null,另外一个是正常的访问链接,判断refer是null 的时候直接跳出执行
  • 打赏
  • 举报
回复
引用 10 楼 Stay_alon 的回复:
使用strust的令牌机制处理重复提交问题
调用这方法不是通过表单提交的,如何使用token?
Stay_alon 2015-05-11
  • 打赏
  • 举报
回复
使用strust的令牌机制处理重复提交问题
  • 打赏
  • 举报
回复
调用这个方法的地方我搜索了就两个个页面,这两个页面引用的js也就是jquery,而且这个重复执行还是随机的,看 tomcat的日志重复执行的时候是两个不同的IP同时发送请求,我觉得原因是不是在网络之类的 什么问题?
nfsnyy007 2015-05-09
  • 打赏
  • 举报
回复
肯定是哪里意外的调用方法了。我觉得你应该在源头上解决它,过一遍你的页面看看哪个js活着什么的错误的调用
lodamemory 2015-05-08
  • 打赏
  • 举报
回复
迅雷插件会使action走两次,你把迅雷插件禁用再试试
比特灵 2015-05-08
  • 打赏
  • 举报
回复
曾经有个项目使用的是 EasyUI + Struts2 的,也有类似的问题,一个动作重复2~3次甚至更多,检查下来是由于easyUi控件使用的问题。
a465606179 2015-05-08
  • 打赏
  • 举报
回复
action 方法名是不是以get开头的?
  • 打赏
  • 举报
回复
现在能调用这个方法的就是两个页面里面有这个推送图书的链接,一个booklist.jsp,一个booksend.jsp,两个页面代码基本类似, 下面是booksend.jsp的源码

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/> 
<script type="text/javascript" src="../web/scripts/jquery/jquery-1.7.1.js"></script>
<title>书籍</title>
<style>
.item_data{padding:5px 10px;margin-top:10px;}
.item_data ul{border:1px solid #4f94cd;padding:5px 10px;border-top:0px;position:relative;border-top:1px solid #4f94cd}
.item_data div{line-height:2em;font-size:14px;}
.item_data span{color:#666;font-size:14px;}
.ea-btn{font-size:14px;display:block;padding:8px 10px;background:#1BB974;line-height:24px;color:#FFF;text-shadow: 0 1px 0 #666;border-radius:5px;text-align:center;}
.ea-btn:hover{opacity: 0.9;color:#FFF;}
.ea-alert{line-height:2em;padding: 8px 35px 8px 10px;margin:20px 5px;font-size:12px;color:#4E0000;text-shadow: none;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);background-color: #F9EDBE;border: 1px solid #F0C36D;border-radius: 2px;}

.even{background:#F0F7FF;}
</style>
<script type="text/javascript">
function clickon(bt){
 if(bt.href=='javascript:void(0)'){return false;}
 $.get(bt.href);
 bt.href='javascript:void(0)';
 var s= bt.innerHTML;
 var num=s.match(/\d+(\.\d+)?/g);
 var i = parseInt(num)+1;
 bt.innerHTML = bt.innerHTML.replace(/\d+(\.\d+)?/g,i);
}
</script>
</head>
<body>
<div id='item_data' class='item_data' >
 <ul>
  <div><span>书名:</span><b>${book.ebookname }</b></div>
  <div><span>格式:</span><b>${book.form }</b></div>
  <div><span><a onClick='clickon(this);return false;' href='book!zan.do?bookId=${book.id }&openId=${openId }'>赞一下(${book.zan })</a>    <a onClick='clickon(this)' href='book!cai.do?bookId=${book.id }&openId=${openId }'>踩一下(${book.cai })</a></span></div>
  <div><span>下载量:${book.count }    文件大小:${book.size }<c:if test="${empty book.size}">未知</c:if> M</span></div>
  <a href='book!send.do?bookId=${book.id }&openId=${openId }' class='ea-btn'>推送</a>
  </ul>
 </div> 
 <div class='ea-alert'>
  <div>Amazon原系统不支持epub格式的推送。</div>
  <div>多看系统不支持azw3格式的推送。</div>
  <div>推送后原系统请等待2-20分钟,机器会自动下载。多看系统请等待5分钟左右,然后断开WIFI重新连接一下。如果没有收到请联系淘宝在线客服。或者发送“机器人”自己排查。
如果是原系统,请先把推送邮箱添加到信任。</div>
  <div><a href='http://qing.blog.sina.com.cn/3362683514/c86e7a7a3300539t.html'>如何添加信任?</a></div>
 </div>
</body>
</html>
另外我查看tomcat的日志里面记录重复发送的请求 如下,实际是一本书向同一人重复推送了3次,我看前面的IP还不一样,不知道是什么原因

101.226.61.142 - - [08/May/2015:15:07:44 +0800] "GET /wechat/m/book!send.do?bookId=491651&openId=oJYpVuAfE4qDCceJXd2nkI1ozTAI HTTP/1.1" 200 1384
180.153.163.189 - - [08/May/2015:15:07:44 +0800] "GET /wechat/m/book!send.do?bookId=491651&openId=oJYpVuAfE4qDCceJXd2nkI1ozTAI HTTP/1.1" 200 1384
183.147.143.105 - - [08/May/2015:15:07:44 +0800] "GET /wechat/m/book!send.do?bookId=491651&openId=oJYpVuAfE4qDCceJXd2nkI1ozTAI HTTP/1.1" 200 1384
tony4geek 2015-05-08
  • 打赏
  • 举报
回复
最好,还得找到,重复提交的点。
  • 打赏
  • 举报
回复
页面很简单,就是引用了下jquery写了一点js 这个项目主要是在微信上面操作的,感觉不是客户端的问题
  • 打赏
  • 举报
回复
引用 1 楼 a465606179 的回复:
action 方法名是不是以get开头的?
不是,方法名就是send()

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧