X5内核  请求超时后会自动阻止请求返回并由代理服务器将原参数重新发送请求到服务层代码。但由于第一次请求已经请求到服务器,会导致出现重复下单、支付等重大问题。

该问题由于腾讯x5浏览器会自动阻止第一次请求返回到页面,届时将抛出io异常。最开始打算通过拦截器来进行拦截第二次请求,但这样将使页面无法接受到返回信息报错。

初步解决思路 当第二次请求访问进服务层时暂停该线程,并定时循环查询第一次请求是否返回成功,将第一次返回成功的结果赋值给第二次。

由于我们系统中所有页面请求都会过一个通用controller 所以也会有很多正常请求通过 为了不影响整体使用

这里我用到了页面验签的方法,用于验证请求是否为同一次。这里先将参数进行排序,再用md5加密,添加一个“sign”的参数到后台,后台再排序加密进行比对,进行验签,注意这里参数加入了

时间戳,用于防止重复提交

KGF.getMD5 = function(params){
params["key"] = "ouE6yWvy";
var sParams = Object.keys(params).sort();
var oriString = "";
for(key in sParams){
oriString += sParams[key]+"="+params[sParams[key]]+"&";
}
oriString = oriString.substr(0,oriString.length-1);
delete params.key;
return KGF.md5(oriString);
};

验签成功后,由于需要将第一次返回成功的结果赋值给第二次。所以需要将调用接口成功的结果存入seesion中,但此时需要及时去清理,否则容易造成服务器内存溢出。

默认调用接口成功后就将结果集放入session,验签一通过就去取,这里的关键在于何时去删除session中的值。由于所有结果访问均会通过该控制器,为了区分不同的请求,

故用sign作为键,返回结果为值。

下面贴出代码

@RequestMapping(value={"/common/ajax.do"}, method={RequestMethod.POST}, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<AjaxResponse> execute2(@RequestHeader(value="Accept", required=false) String accept, HttpServletRequest request){
XMLResults results = new XMLResults();
try{
AjaxObject object = (AjaxObject)request.getAttribute("ParamName");
String openid = (String) request.getSession().getAttribute("openid");
Class[] cArg = new Class[2];
cArg[0] = HttpServletRequest.class;
cArg[1] = Map.class;
DataResult dataResult = new DataResult();
Map<String, Object> params = object.getParams();
String signFromAjax = (String) params.get("sign");
long startTime = 0;
long endTime = 0;
if(!checkSign(params)){
log.error("接口请求验签失败");
dataResult.setRetInfo("-1", "接口请求验签失败", CommonUtil.parseDoubleList(new HashMap()));
}else{
String signFromSession = (String) request.getSession().getAttribute(signFromAjax);
request.getSession().setAttribute(signFromAjax,signFromAjax);
//处理腾讯安卓微信浏览器,10s重发请求的问题
if(signFromSession != null){
for(int i = 0; i <10; i++){
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("====================重复请求读取接口返回信息:第"+(i+1)+"次====================");
DataResult dataResultFromSession = (DataResult) request.getSession().getAttribute(signFromAjax+"interfaceResult");
if(dataResultFromSession != null){
request.getSession().removeAttribute(signFromAjax);
request.getSession().removeAttribute(signFromAjax+"interfaceResult");
results = this.baseService.convertResult(dataResult);
dataResult = dataResultFromSession;
break;
}
if(i == 9){
dataResult.setRetInfo("-1", "接口请求超时,请联系管理员", CommonUtil.parseDoubleList(new HashMap()));
}
}
}else{
startTime = new Date().getTime();
params.put("requestIp", CommonUtil.getIpAddr(request));
params.put("openid", openid);
params.put("deviceType", CommonUtil.getDeviceType(request));
params.put("browserType", CommonUtil.getBrowserType(request));
params.put("g_stationaddr", CommonUtil.getIpAddr(request));
Method method = commonDataModel.getClass().getDeclaredMethod(object.getCode(), cArg);
dataResult = (DataResult) method.invoke(commonDataModel, request, params);
endTime = new Date().getTime();
request.getSession().setAttribute(signFromAjax+"interfaceResult", dataResult);
}
}
if(endTime - startTime <= 10000){
request.getSession().removeAttribute(signFromAjax);
request.getSession().removeAttribute(signFromAjax+"interfaceResult");
}
results = this.baseService.convertResult(dataResult);
}catch (Exception e){
log.error("数据请求失败,错误信息:" + e.getMessage());
results.setRetInfo("-1", "数据请求失败");
}
return webHelper.convertAjaxResponse(results);
}

微信内置安卓x5浏览器请求超时自动重发问题处理小记的更多相关文章

  1. 2017年05月10日记一次微项目投产 | 安卓版微信内置浏览器不能解析gzip压缩过的mp4视频的问题

    前言 今天投产了一个小项目,一个很简单的H5,有播放视频功能,使用了videojs插件. 之前也做过数个视频播放,视频的转压都按照既定流程进行,文件放到FTP后,iphone和安卓机测试下来都没有问题 ...

  2. 让微信内置浏览器兼容clipboard.js 复制粘贴 ios 安卓

    <!--js copy事件--><script type="text/javascript" src="/static/js/clipboard.min ...

  3. 微信内置浏览器http请求10秒内接收不到数据会自动重发第二遍请求

    微信内置浏览器http请求10秒内接收不到数据会自动重发第二遍请求     这是个坑

  4. asp.net微信内置浏览器下Session失效

    问题记录:仅限安卓端微信内置浏览器,服务器集群设置了黏性Session,在Post请求时会强制走代理,导致出去的ip指向另一台服务器,黏性Session失效,用户状态无法保存. 目前想知道除了设置Se ...

  5. 微信内置浏览器WebApp开发,踩坑 · Issue #31 · maxzhang/maxzhang.github.com · GitHub

    最近花6天时间完成了一个七夕的小活动,是一个简单的WebApp.由于我前期对面向微信的Web开发评估不足,导致开发过程十分艰难.写这篇文章总结下,惊醒自己未来不要再犯这样的错误. 问题: 1. 有些比 ...

  6. 微信内置浏览器的JsAPI(WeixinJSBridge续)[转载]

    原文地址:  http://www.baidufe.com/item/f07a3be0b23b4c9606bb.html 之前有写过几篇关于微信内置浏览器(WebView)中特有的Javascript ...

  7. 【微网站开发】之微信内置浏览器API使用

    最近在写微网站,发现了微信内置浏览器的很多不称心的地方: 1.安卓版的微信内浏览器底部总是出现一个刷新.前进.后退的底部栏,宽度很大,导致屏幕显示尺寸被压缩 2.分享当前网站至朋友圈时,分享的图片一般 ...

  8. 微信内置浏览器中,点击下拉框出现页面乱跳转现象(iphone)

    微信内置浏览器中,点击下拉框出现页面乱跳转现象(iphone) 前言: 这是小菜博客的第三篇文章.一直认为自己可以表达的东西太过简单,难以上台面,总是吝啬地不肯写.就算是写,也不知道从何开始.在同事的 ...

  9. 微信内置浏览器的JsAPI(WeixinJSBridge续)_Alien的笔记

    微信内置浏览器的JsAPI(WeixinJSBridge续)_Alien的笔记 微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏 之前有写过几篇关于微信内置浏览器(WebView) ...

随机推荐

  1. Linux 相关术语_002

    Linux(Linux is not unix)是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统. 它能运行主要的UNIX工 ...

  2. LinkedBlockingQueue源码分析

    1. LinkedBlockingQueue源码分析(JDK8) 2. LinkedBlockingQueue源码分析 啦啦啦

  3. C# TreeView 拖拽节点到另一个容器Panel中简单实现

    C# TreeView 拖拽节点到另一个容器Panel中简单实现 用了这么久C#拖拽功能一直没有用到也就没用过,今天因为项目需要,领导特地给我简单讲解了下拖拽功能,真是的大师讲解一点通啊.特地写一篇博 ...

  4. [原]Jenkins(十九) jenkins再出发之jenkins邮件通知

    1.下载插件: 2.配置插件: 3.邮件插件配置 4.设置触发器:

  5. 关于vb编程之字符串连接/拼接的方法与技巧

    在VB中,笔者知道的字符串的拼接方法主要有两种拼接符号,一种为"&"符,另一种则为"+"符 一.其中&连接运算符用于强制将两个表达式作为字符串连 ...

  6. lxml xpath 爬取并正常显示中文内容

    在使用python爬虫提取中文网页的内容,为了能正确显示中文的内容,在转为字符串时一定要声明编码为utf-8,否则无法正常显示中文,而是显示原编码的字符,并没有正确转换.比如下面这个简单的爬取百度页面 ...

  7. Spring 注解配置(2)——@Autowired

    版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5626365.html  @Autowired 注释,它可以对类成员变 ...

  8. 谷歌浏览器(Chrome)禁止浏览器缓存 设置

    在开发项目期间用谷歌浏览器调试,他总是缓存我的css样式这个很气人啊,后经过摸索找到了方法,如下 先F12或者shift+ctrl+j 打开调试者工具,在找Network这个tab按钮,点击进入,勾选 ...

  9. 异常HTTP Status 500 - Illegal access to constructor, is it public? java.lang.IllegalAccessException: Class com.opensymphony.xwork2.ObjectFactory can not access a member of class action.CoreAction with

    Exception report message Illegal access to constructor, is it public? description The server encount ...

  10. Flv视频格式如何转换成MP4格式

    如何将flv视频格式转换成MP4格式呢?随着现在视频格式的不断多样化,视频格式转换的问题也成了现在生活中常见的问题,那么我们应该怎样将flv视频格式转换成MP4格式呢?下面我们就一起来看一下吧. 操作 ...