扫码时扫一次码,后台运行了两次,是什么问题呢

来源:15-17 前端展示系统补强之消费记录二维码的生成以及消费记录的添加

杰哥大大

2018-03-04

2018-03-04 13:59:24.608[http-nio-8080-exec-1]DEBUGc.h.w.dao.Dao_UserProductMap.insertUserProductMap-==> Parameters: 1(Long), 34(Long), 1(Long), 5(Long), 2018-03-04 13:59:24.543(Timestamp), 1(Integer)

2018-03-04 13:59:24.618[http-nio-8080-exec-3]DEBUGc.h.w.dao.Dao_UserProductMap.insertUserProductMap-==> Parameters: 1(Long), 34(Long), 1(Long), 5(Long), 2018-03-04 13:59:24.54(Timestamp), 1(Integer)

2018-03-04 13:59:24.648[http-nio-8080-exec-1]DEBUGc.h.w.dao.Dao_UserProductMap.insertUserProductMap-<==    Updates: 1

2018-03-04 13:59:24.648[http-nio-8080-exec-3]DEBUGc.h.w.dao.Dao_UserProductMap.insertUserProductMap-<==    Updates: 1


写回答

5回答

翔仔

2018-03-04

同学这个去重有很多种方法 只要奏效即可 学到这个章节希望同学能锻炼出举一反三的能力,主观题自由作答,同学可以多理解上面利用session去重或者别的去重方案去解决,去重的核心就是何为重,怎么确定操作来自同一个请求转发两次 我们有什么属性能证明其唯一(userid awardid):)

0
5
翔仔
回复
杰哥大大
刚刚我说的redis是一个主流的去重做法 同学请你独立思考 分析一下为什么要这样做 咱们由于两次重复提交 必须先判断请求是否是重复提交 重复提交有两个条件 1.操作员相同 2.时间相近(一秒以内) 那该如何判定非常明显了啊 保存前一次内容 跟后一次做比较就成了
2018-03-05
共5条回复

杰哥大大

提问者

2018-03-04

按照那个调了一下还是不太懂,时间戳也不太懂的用。。。应该如何修改?

/**
	 * 添加消费记录
	 */
	@Override
	@Transactional
	public UserProductMapExecution addUserProductMap(UserProductMap userProductMap)
			throws UserProductMapOperationException {
		// 空值判断,主要确保顾客Id,店铺Id以及操作员Id非空
		if (userProductMap != null && userProductMap.getUser().getUserId() != null
				&& userProductMap.getShop().getShopId() != null && userProductMap.getOperator().getUserId() != null) {
			// 设定默认值
			userProductMap.setCreateTime(new Date());
			try {
				// 添加消费记录
				int effectedNum = userProductMapDao.insertUserProductMap(userProductMap);
				if (effectedNum <= 0) {
					throw new UserProductMapOperationException("添加消费记录失败");
				}
				// 若本次消费能够积分
				if (userProductMap.getPoint() != null && userProductMap.getPoint() > 0) {
					// 查询该顾客是否在店铺消费过
					UserShopMap userShopMap = userShopMapDao.queryUserShopMap(userProductMap.getUser().getUserId(),
							userProductMap.getShop().getShopId());
					if (userShopMap != null && userShopMap.getUserShopId() != null) {
						// 若之前消费过,即有过积分记录,则进行总积分的更新操作
						userShopMap.setPoint(userShopMap.getPoint() + userProductMap.getPoint());
						effectedNum = userShopMapDao.updateUserShopMapPoint(userShopMap);
						if (effectedNum <= 0) {
							throw new UserProductMapOperationException("更新积分信息失败");
						}
					} else {
						// 在店铺没有过消费记录,添加一条店铺积分信息(就跟初始化会员一样)
						userShopMap = compactUserShopMap4Add(userProductMap.getUser().getUserId(),
								userProductMap.getShop().getShopId(), userProductMap.getPoint());
						effectedNum = userShopMapDao.insertUserShopMap(userShopMap);
						if (effectedNum <= 0) {
							throw new UserProductMapOperationException("积分信息创建失败");
						}
					}
				}
				return new UserProductMapExecution(UserProductMapStateEnum.SUCCESS, userProductMap);
			} catch (Exception e) {
				throw new UserProductMapOperationException("添加授权失败:" + e.toString());
			}
		} else {
			return new UserProductMapExecution(UserProductMapStateEnum.NULL_USERPRODUCT_INFO);
		}
	}


0
0

翔仔

2018-03-04

还有一个思路可以在session里用key记录一个用户id,value是访问微信链接回传的时间戳,然后每次回传回来的时候如果是同一个用户,则取出value与当前时间戳判断,如果小于一秒,则认为是重复访问,则丢弃本次操作并更新该key的value为现在时间。这样就能避免两次重复操作。不知道同学能否理解

0
2
杰哥大大
在controller的adduserproductmap里改吗?
2018-03-04
共2条回复

翔仔

2018-03-04

用IP的对吗 两次不影响就没事 我这边就没影响 确实有时候会有两次

0
4
翔仔
回复
杰哥大大
这个真不清楚,能看到微信那边的日志就好了,还有可能是手机识别两次也有可能,微信浏览器发两次请求啥的。最好按照翔仔说的做个去重,到了第三方的话能做的事情就少好多了
2018-03-04
共4条回复

翔仔

2018-03-04

是公网ip还是域名 ip可能由于验证什么的会有两次回发 这是微信本身的问题 不影响使用

0
1
杰哥大大
但是sql语句也运行了两次
2018-03-04
共1条回复

Java双版本(SSM到SpringBoot)校园商铺全栈开发

SSM商铺V1.0,解决毕设痛点;SpringBoot商铺V2.0,满足工作刚需

5113 学习 · 8144 问题

查看课程