各位大神老师能否帮忙修改一下controller层代码,实现用户在用一时间只能进行一次接口的方法

[复制链接]
查看11 | 回复5 | 2021-1-27 07:15:46 | 显示全部楼层 |阅读模式
操作员扫码的时候是有user_id的,并且操作的时候是有当前的时间的。怎么在那第一次来的时候,把user_id和当前的时间存入到session里面key是user_id值是当前时间。下次来的时候如果是相同的user_id则取出session里对应user_id的值也就是上次的时间值,如果间隔小于1秒那么就是重复访问,就直接return。怎么在代码里实现,帮忙修改一下controller层的代码谢谢
controller层
@RequestMapping(value="/adduserproductmap",method=RequestMethod.GET)
privateStringaddUserProductMap(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{
//获取微信授权信息
WechatIdeniden=getOperatorInfo(request);
if(iden!=null){
PersonInfooperator=iden.getPersonInfo();
request.getSession().setAttribute("user",operator);
//获取二维码里state携带的content信息并解码
StringqrCodeinfo=newString(
URLDecoder.decode(HttpServletRequestUtil.getString(request,"state"),"UTF-8"));
ObjectMappermapper=newObjectMapper();
WechatInfowechatInfo=null;
try{
//将解码后的内容用aaa去替换掉之前生成二维码的时候加入的aaa前缀,转换成WechatInfo实体类
wechatInfo=mapper.readValue(qrCodeinfo.replace("aaa","\""),WechatInfo.class);
}catch(Exceptione){
return"shop/operationfail";
}
//校验二维码是否已经过期
if(!checkQRCodeInfo(wechatInfo)){
return"shop/operationfail";
}
//获取添加消费记录所需要的参数并组建成userproductmap实例
LongproductId=wechatInfo.getProductId();
LongcustomerId=wechatInfo.getCustomerId();
UserProductMapuserProductMap=compactUserProductMap4Add(customerId,productId,iden.getPersonInfo());
if(userProductMap!=null&&customerId!=-1){
try{
if(!checkShopIden(operator.getUserId(),userProductMap)){
return"shop/operationfail";
}
UserProductMapExecutionse=service_UserProductMap.addUserProductMap(userProductMap);
if(se.getState()==UserProductMapStateEnum.SUCCESS.getState()){
return"shop/operationsuccess";
}
}catch(RuntimeExceptione){
return"shop/operationfail";
}
}
}
return"shop/operationfail";
}
//根据code获取UserAccessToken,进而通过token里的openId获取微信用户信息
privateWechatIdengetOperatorInfo(HttpServletRequestrequest){
Stringcode=request.getParameter("code");
WechatIdeniden=null;
if(null!=code){
UserAccessTokentoken;
try{
token=WechatUtil.getUserAccessToken(code);
StringopenId=token.getOpenId();
request.getSession().setAttribute("openId",openId);
iden=service_WeChatIden.getWechatIdenByOpenId(openId);
}catch(IOExceptione){
e.printStackTrace();
}
}
returniden;
}
//超过5分钟则认为过期
privatebooleancheckQRCodeInfo(WechatInfowechatInfo){
if(wechatInfo!=null&&wechatInfo.getProductId()!=null&&wechatInfo.getCustomerId()!=null
&&wechatInfo.getCreateTime()!=null){
longnowTime=System.currentTimeMillis();
if((nowTime-wechatInfo.getCreateTime())

分 -->
回复

使用道具 举报

千问 | 2021-1-27 07:15:46 | 显示全部楼层
怎么禁止用户同时访问二维码的url?
回复

使用道具 举报

千问 | 2021-1-27 07:15:46 | 显示全部楼层
怎么禁止用户同时访问二维码的url?
回复

使用道具 举报

千问 | 2021-1-27 07:15:46 | 显示全部楼层
只谈思路
不管如何,每次操作都需要一个唯一标识字段,每次请求校验这个字段,如果不存在则保存到每个服务器上都能访问到的介质上(单机就放内存,集群丢各种缓存/数据库),保证线程安全即可
细节就不扯了
回复

使用道具 举报

千问 | 2021-1-27 07:15:46 | 显示全部楼层
最简单的方法。。前端设置轮询时间。。。。
回复

使用道具 举报

千问 | 2021-1-27 07:15:46 | 显示全部楼层
@RequestMapping(value="/adduserproductmap",method=RequestMethod.GET)
privateStringaddUserProductMap(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{
//获取微信授权信息
WechatIdeniden=getOperatorInfo(request);
if(iden!=null){
PersonInfooperator=iden.getPersonInfo();
request.getSession().setAttribute("user",operator);
longtime;
if((time=request.getSession().getAttribute(operator.getId()))!=null){
if(newDate().getTime-time
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行