微信内置浏览器Ajax请求10s超时重发问题的解决方案

Fiddler抓包原理与实战:前端网络调试不可替代的底层工具 HTTP/HTTPS抓包是前端可观测性的基础能力,其核心在于理解代理机制、TLS中间人解密原理及跨进程流量捕获逻辑。Fiddler作为轻量级系统级代理工具,不依赖浏览器内核,可穿透双核浏览器、Webview、IE兼容模式等受限环境,解决DevTools无法覆盖的‘请求发没发出、被谁拦截、响应是否异常’等确定性问题。它在HTTPS解密、AutoResponder本地替换、FiddlerScript自动化等场景中展现出独特技术价值,广泛应用于线上问题复现、跨域调试、老旧系统兼容性排查及API行为验证等工程实践。 阅读详情

        最近在做一个微信公众号的项目,期间遇到一个纠结了几天的问题,就是微信页面上激活一次Ajax,实际执行两次请求,由于现实情况原因,该Ajax请求有时延迟会在20s以上。分析后台日志发现,如果Ajax请求超过10s,后台就会再次收到相同请求,这是第一次请求就会自动阻止。导致的直接后果就是多次相同业务处理,无法正常返回,进而引发一系列问题。

        立即上网查询,发现遇到相似问题的还真不了,也大概知道了是什么原因造成的这种问题。这个机制简单说就是,如果你的某个Ajax请求10s超时,微信内置浏览器会自动使用代理进行提交,并且会打断第一次提交。知道了原因,接下来就是解决问题了。

        项目Web应用程序采用的是Spring MVC框架,@Controller层接收前台请求,业务层进行处理。

        问题解决思路,当第二次请求访问到达@Controller时暂停业务处理,并定时循环查询第一次请求是否成功返回,并将第一次请求结果直接赋值给第二次请求,并返回给前端。

        为了确认某次请求是否是微信内置浏览器重发,我们在Ajax请求时增加了一个时间戳var timestamp = new Date().getTime(),利用该时间戳+openid来唯一确定某次请求StringsignFromAjax = MD5.getMessageDigest(tmp.getBytes()),首先判断session中是否存在signFromAjax,如果存在则说明本次请求来自微信内置浏览器重发,否则则说明是首次请求,要求把首次请求生成的signFromAjax写入session。

        首次请求需要把业务处理结果存入session中,重发请求(第二次请求)定时从session中读取处理结果返回给前端,问题迎刃而解。

前端代码:

function doStartChg() {
	var timestamp = new Date().getTime();
	$("#loadingToast").show();
	$.ajax({
		type: 'post',
		url : '${ctxMain}/f/wechat/chg/startchg?time='+timestamp,
		timeout : 20000, //超时时间设置,单位毫秒
		async:true,
		success : function(resp, textStatus) {
			$("#loadingToast").hide();
			var jsonObj = eval('('+resp+')');
			if(jsonObj.success) {
				var data = jsonObj.data;
			}else {
				alert(jsonObj.message);
			}
		},
		error : function() {
			$("#loadingToast").hide();
		},
           complete: function (XMLHttpRequest,status) {
               if(status == 'timeout') {
               	alert("操作超时");
               }
           }
	});
}

后台代码:

@ResponseBody
@RequestMapping(value = "startchg")
public String startCharge(HttpServletRequest request, HttpServletResponse response) {
	String time = request.getParameter("time");
	String openid = (String)request.getSession().getAttribute("oid");
	String tmp = openid + "==" + time;
	
	long startTime = 0;
    long endTime = 0;
	Map<String,String> startMap = Maps.newHashMap();
	String signFromAjax = MD5.getMessageDigest(tmp.getBytes());
	String signFromSession = (String) request.getSession().getAttribute(signFromAjax);
    request.getSession().setAttribute(signFromAjax, signFromAjax);
    //处理浏览器Ajax重发问题
    if(signFromSession != null) {
    	for(int i = 0; i <10; i++) {
            try {
                Thread.currentThread().sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            logger.info("====================start重发请求读取接口返回信息:第"+(i+1)+"次====================");
            Map<String, String> dataResultFromSession = (Map<String, String>)request.getSession().getAttribute(signFromAjax+"interfaceResult");
            if(dataResultFromSession != null) {
                request.getSession().removeAttribute(signFromAjax);
                request.getSession().removeAttribute(signFromAjax+"result");
                startMap = dataResultFromSession;
                break;
            }
            if(i == 9) {
            	startMap.put("success", "false");
            	startMap.put("message", "操作超时,请重试");
            }
        }
    }else {
    	startTime = new Date().getTime();
    	....
    	//业务处理
    	startMap = appTradeRecService.readyChargeOfStake(...);
    	....
    	endTime = new Date().getTime();
    	request.getSession().setAttribute(signFromAjax+"result", startMap);
    }
    if(endTime - startTime <= 10000) {
        request.getSession().removeAttribute(signFromAjax);
        request.getSession().removeAttribute(signFromAjax+"result");
    }
    
    return JsonMapper.nonDefaultMapper().toJson(startMap);
}


Claude归零层:隐式语义压缩与熵值调控机制解析 大语言模型的响应优化正从显式参数控制转向隐式语义压缩,其核心是通过推理时序中的动态熵值调控与指令锚定,实现信息密度提升与冗余消除。这种技术不依赖RAG或微调,而是在token生成过程中实时评估边际信息贡献,过滤低价值填充词、重复主语和解释性冗余,从而在保持语义完整性前提下显著降低输出token数。它直接支撑高敏感场景——如合规报告生成、语音合成响应、按token计费系统等——对一致性、成本与长度的严苛要求。本文聚焦Claude最新‘归零层’机制,深入解析其前置语义锚定、动态熵值门控与后置校验三重协同原理,并 阅读详情

相关推荐

Node.js + GitHub Webhooks 实现远程项目自动同步

GitHub Webhooks 是一种基于 HTTP 的事件通知机制,用于在代码仓库发生变更(如 push)时实时触发外部服务;Node.js 凭借其轻量 HTTP 服务能力和成熟的子进程控制(如 child_process、simple-git),成为实现服务端自动化同步的理想运行时。该方案核心在于将部署行为从‘人工驱动’升级为‘事件驱动’,通过签名校验、安全 Git 拉取、优雅进程重启等环节保障可靠性,适用于中小团队、独立开发者及 DevOps 初学者在无 CI/CD 平台支撑下的生产环境快速落地。典型

weixin_30326741的博客 368

Ajax学习:请求重复发送--阻止

一般情况,用户每触发一次事件。就会产生一次请求,但如果这时候服务器响应比较慢,用户疯狂点击,服务器的压力就会很大,服务器接收了很多相同的请求,就会导致服务器崩溃。-因为如果这个请求是一个失败的请求,如果在成功里面判断 这个请求永远不会为false。可以当你点击多次的时候,如果前面具有相同请求,就会停止前面的请求,只发出当前申请的请求。创建标识变量,标识是否发送AJAX请求。//不要在状态码中判断-

weixin_47295886的博客 568

海康摄像头V3.4 升级改造VUE3

摘要:本文介绍了一个基于Vue3的海康威视摄像头组件封装方案。针对官方仅提供HTML版本SDK的问题,作者通过封装实现了Vue3组件化集成,解决了iframe/webview引入方式的弊端。组件核心功能包括实时预览、本地录像、录像下载、截图抓拍等,并优化了SDK初始化逻辑(单例模式)、定位问题修复和错误处理机制。关键技术点包括:1)SDK插件容器定位修复;2)录像下载进度监控;3)多格式图片数据处理;4)多窗口场景下的SDK实例管理。该组件可直接通过npm安装使用,提供了完善的API和事件接口,显著提升了海

LINLINLINShi的博客 113

前端页面超时时间设置

前端页面超时时间设置

真正的大师永远怀着一颗学徒的心 1万+

PCout(n) -- STM32F103RCT6 位带操作

位带操作,sys.h,PCout,PAout,PAout

weixin_50212044的博客 4021

【原创】关于西门子S120 的电气图纸设计

我们首先要了解一下模块的基本信息:SINAMICS 功率模块 PM240-2 三相交流380-480V+10/-10% 47-63Hz;至此,我们选择的驱动系统配置的资料都已经查找完毕,接下来就是根据每个部件的功能接口和我们需要实现的功能画出接线连接图,这样关于伺服电机控制,硬件部分设计就完成了。2)FSA - FSC 型功率模块 PM240-2 的屏蔽连接板外形尺寸图,所有数据以毫米(英寸)为单位。1)FSA 型功率模块 PM240-2 的外形尺寸图,所有数据以毫米(英寸)为单位。

Qinmingyue13的博客 2638

WKWebView/UIWebView/Safari 网页加载失败或空白以及10s超时问题

参考:jQery ajax()请求的页面执行时间超过10秒时,在Safari中出错 使用WKWebView加载网页,该网址在其他任何浏览器均可加载出来,其中包括safari浏览器也是10s超时,来看debug截图 原因就在于, 后端给网页响应的时间过长,大概28s左右,这个响应时间下, Chrome浏览器以及其他浏览器仍旧可以等待响应, 而Safari系浏览器由于优化用户体验,在进行同步请...

iOSTianNan的博客 9773

嵌入式SDIO 总线面试题及参考答案

SDIO 的 4 位总线模式是一种提高数据传输效率的工作模式。在传统的 1 位总线模式下,数据只能通过一根数据线(DAT0)进行传输,这限制了数据传输的带宽和速度。而在 4 位总线模式下,DAT0 - DAT3 这 4 根数据线同时用于数据传输,相当于在同一时间内可以传输 4 倍于 1 位模式的数据量,从而显著提高了数据传输的带宽和速度。要通过 CMD6 命令将 SDIO 总线从当前模式切换到 4 位总线模式,需要遵循以下步骤:第一步,主设备需要确保 SDIO 卡支持 4 位总线模式。

大模型大数据攻城狮的专栏 1719

Ajax请求耗时分析

** Ajax请求耗时分析 1.请求发送时数据获取压缩传输(当数据量小时可能看不出来但当数据量大例如4M时在2M/s的传输速率下需要2s) 2.服务端处理时间(这块讲道理也算但其实并受请求控制) 3.请求返回结果到前端传输时间 4.请求从json传转为obj即数据处理时间 ** ...

sp的小站 1153

第五节_PySide6基本窗口控件_主窗口和标签

本文介绍了PySide6中主窗口和标签控件的使用。主要内容包括: 窗口控件分类: QWidget是基础窗口部件,可作为独立窗口或子部件 QMainWindow提供标准应用程序框架,包含菜单栏、工具栏等 QDialog用于对话框,支持模态交互 主窗口创建: 演示了如何创建QMainWindow子类 实现了窗口居中、设置图标、状态栏等功能 提供了窗口几何信息的获取方法 QLabel标签控件: 继承自QFrame类 用于显示文本或图像 文章通过代码示例详细说明了主窗口的创建和使用方法,包括位置控制、图标设置等常见

su桥木的博客 1021

基于深度学习的图像识别技术在农业领域中的应用

是识别"病害种类"还是"病害严重度分级"?前者是分类,后者常需分割或分级回归。是叶片级(离体叶片图像)、植株级(田间单株)、地块级(无人机俯拍)?视角不同,模型差异巨大。实时无人机巡检可能要求 < 50 ms/帧(Jetson Orin),而离线测报可接受秒级推理。类别标签、结构化 JSON、GIS 图斑、报警事件?

AI天才研究院 2166

微信内置安卓x5浏览器请求超时自动重发问题处理小记

X5内核 请求超时后会自动阻止请求返回并由代理服务器将原参数重新发送请求到服务层代码。但由于第一次请求已经请求到服务器,会导致出现重复下单、支付等重大问题。 该问题由于腾讯x5浏览器会自动阻止第一次请求返回到页面,届时将抛出io异常。最开始打算通过拦截器来进行拦截第二次请求,但这样将使页面无法接受到返回信息报错。 初步解决思路 当第二次请求访问进服务层时暂停该线程,并定时循环查询第一次请求是...

weixin_30378623的博客 415

37、免驱动USB双目同步测距3D活体深度检测和RV1126结合V4L开发USB摄像头使用

基本思想:需要使用双目摄像头在rv1126上进行活体检测,然后将画面实时返回到桌面上,记录一下。第二步:刷机rv1126开发板系统和ssh远程连接,见参考目录。第一步:购买可见光的红外摄像头,见参考连接,在PC端测试可用。

sxj731533730 2621

关于微信触发2次请求的问题【已解决】【原】

关于微信触发2次请求的问题 [终极方案请直接点此跳转] 现象描述 测试组在测试环境验证问题的时候,发现在手机微信页面点击某个按钮,却触发了2次ajax请求.于是开发组小伙伴在修正这个bug的过程中, 一会怀疑前端js问题, 一会又怀疑后端java代码问题, 却没考虑到网络链路转发机制的问题.后来笔者提议不改前台,只改后台,注释全部业务代码,改成让线程直接睡眠 Thread.currentTh...

weixin_30361641的博客 2785

KylinOS 离线安装 MinIO【图文步骤】

在国产操作系统 KylinOS 中安装 MinIO,详细步骤...

甘蓝的专栏 1535

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

微信公众号开发的那些坑

安卓手机 微信浏览器会对ajax 请求10s后未响应,会自动进行重发请求

windy470411986的专栏 344

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

支付FM支付接口平台常见问题汇总

如果支付FM收到商户的业务系统应答超时或者不是返回success,支付FM认为通知异常,支付FM会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但不保证通知最终能成功。注意:一般有些系统的接口地址配置时候不用带/,如果请求失败,请去掉 兼容易支付规范接口地址后的 / 或 容易支付规范接口地址拼接 submit.php。顾客支付完成后(订单状态为“已支付”),支付FM把相关支付结果和相关信息发送给商户的业务系统,商户系统需要接收处理该消息,并返回应答。接口地址使用https开头的地址进行请求。

vivi945的博客 1584

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何构建自己的支付系统

文章目录名词解释业务场景模块划分业务流程支付退款对账避坑指南 名词解释 第三方渠道:指支付宝、微信、银联、度小满等第三方金融平台; 业务方:指自己的业务模块; 支付单:支付单分为两,渠道支付订单号和商户订单号,其中渠道支付订单号是第三方渠道生成的订单,而商户订单号是业务方自己生成业务的标识,进行外部对账以渠道支付订单号为准,进行内部对账时,以商户订单号为准; 退款单:与支付单对应,它会与原始支付单...

teaandnoodle的专栏 1263

ASP.NET MVC中集成SignalR实现实时推送的完整指南

实时通信是现代Web应用的核心能力之一,其本质是突破HTTP请求-响应模型的单向限制,实现服务端主动、低延迟的消息下发。SignalR作为微软官方提供的实时双向通信抽象层,封装了WebSocket、SSE与长轮询等底层传输机制,并具备自动降级、连接保活、负载均衡支持等生产就绪特性。它与ASP.NET MVC深度集成,共享依赖注入、身份认证和路由系统,使开发者能以声明式方式在Controller或后台服务中触发推送,显著降低轮询带来的服务器压力与网络开销。本文聚焦于MVC架构下SignalR的工程化落地,涵盖

ciyinzhi8788的博客 454

人生最好的php,mysql,linux,redis,docker等相关技术经典面试题,新手收藏学习,持续更新中。。。

php面试题 1、写出你能想到的所有HTTP返回状态值,并说明用途(比如:返回404表示找不到页面) # 200:服务器请求成功 # 301:永久重定向,旧网页已被新网页永久替代 # 302:表示临时性重定向 # 400:错误请求 # 401:未授权,没有权限,未登录 # 403:禁止访问 # 404:找不到页面 # 500:系统错误,服务器错误 # 502:无效响应 # 503:服务不可用,服务器由于维护或者负载过重未能应答 # 504:网关超时(nginx做为反向代理服务器,所连接的应用服务器无响应导致

cxhblog的博客 1万+

A091_hrm07_用户中心_注册

1.内容 1. 用户站点搭建 2. 门户-用户前端搭建 3. 个人中心 4. 用户注册 2.用户站点搭建 2.1.用户站点搭建 2.2.创建工程 hrm-user-parent hrm-user-common hrm-user-server-1090 2.3.相关组件集成 2.4.基础代码生成 2.5.表分析 2.6.位状态 2.7.生成代码 3.门户-用户前端搭建 3.1.搭建工程 3.1.1.创建静态项目 Hrm-website-parent Hrm-website-user

窗外有风景,笔下有前途,低头是题海,抬头是未来 297

SpringBoot饭店预约系统架构设计与性能优化

现代餐饮行业数字化转型中,高效连接消费者与商家是核心需求。基于SpringBoot的B/S架构系统通过分层设计(表现层、业务层、数据层)实现高并发处理,采用MySQL与Redis构建稳定数据存储方案。关键技术亮点包括智能预约排期算法提升座位利用率20%以上,以及SVG实现的实时座位可视化模块。系统集成Spring Security与JWT保障安全,通过RabbitMQ实现消息通知的削峰填谷。在性能优化方面,采用多级缓存策略(Caffeine本地缓存+Redis集群)应对高峰时段每分钟上千次查询请求,并通过S

weixin_29306571的博客 234

微信出现两次访问服务器,微信浏览器的坑-坑爹的重复请求

微信浏览器的坑-坑爹的重复请求现在基于公众号的开发实际都是利用微信的接口以及微信客户端的特殊功能,但最终还是网页技术,也就是说利用微信浏览器打开网页。但是这坑爹的微信浏览器,它会造成服务器重复请求。害处一、无端加重服务器负担。害处二、很多东西都要做防止重复提交功能,这个重复提交还不是传统的 JS 控制,而是用令牌在服务器端控制。正常人的思维:微信浏览器 -> 服务器。微信傻叉思维:微信浏览器...

weixin_33989935的博客 1637

聊聊微信内页面发Ajax请求会重复请求的问题

转载于:https://blog.fishlee.net/2016/07/07/double-request-from-wechat-client-with-ajax/ 背景 这是个大坑,耗费了我极多的时间。 事情呢,是这样的。最近几天做了一个微信里的潜入页,用于注册账户的。注册很简单,输入手机号-验证短信验证码-填一点资料-注册成功。 作为一个单页面操作,所有请求都是通过AJAX和服务器...

taoerchun的专栏 1437

关于android内置微信浏览器,10秒自动重复提交的大坑,简单出爆,干掉他

先说说这个机制问题,10秒超时,微信浏览器会自动使用代理进行提交,并且会打断第一次提交,如果你是订单的话,你就只能呵呵了。 我就是有个功能,上传一堆的附件到oss去,结果超过10s了,你会发现时间越来越久,原来微信给你再次提交,订单直接报id错误。 移动端的ie6,不想说什么了,直接贴代码:  /**      * 保存车辆申请记录      */     @CheckLogin  

u011473036的专栏 6038
上一篇: Android工程中compileSdkVersion、minSdkVersion、targetSdkVersion区别
下一篇: 微信公众号开发获取微信用户openid及访问url身份认证方式
wangpf2011
博客等级 码龄16年 71粉丝 75原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值