安卓机微信跨域请求浏览器服务后台,会偶尔出现:响应超过10S,安卓机会默认转发请求,两次数据一模一样,后台区分不出来,但是又需要拿到第一次请求的结果。后台还要考虑区分出是客户人为的二次请求和微信默认的二次请求。有什么好办法能限制住二次请求或者区分两次的请求吗?限制住或区分开之后,有什么好的办法取到第一次的结果返回给前台?(循环查询,线程等待拿第一次结果这个感觉不是太好)
每次请求后面跟个参数flag,可以用当前时间的时分秒,也可以用GUID。判断的时候,两次请求的参数flag如果相同,说明是转发的,如果后面的参数不同,说明是人为发起的二次请求。
区分开之后,有什么好的办法取到第一次的结果返回给前台?(循环查询,线程等待拿第一次结果这个感觉不是太好)
@迷茫呀: 一般的为了防止重复插入数据,在插入之前都会做一次查询,不存在则插入。同理,在做查询的时候做一个过滤,当前相同的查询不存在则查询:把所有的flag存在集合里,当集合存在这个查询的这个flag时,不进行查询,只有当不存在的时候,才执行查询。 如果是默认转发的请求,那么第二次的flag肯定和第一次的一样,第一次的flag已经存在集合里了,第二次再去请求时就无效了,但是第一次的flag由于不在集合里,所以该查直接查即可,不用等。这里涉及几个点:1,集合用什么存,全局的static变量或者程序里的缓存 2.每次请求当flag不在集合里时,将当前flag插入集合(这是为了不做第二次查询使用) 这个集合其实就是相当于一个临时的查询记录,起的作用是存在相同记录则不查。
@自闭玩家: 这个场景在不是查询表,是这样的:是微信请我们系统,我们后台系统会做一系列的处理,然后会再次另外的第三个系统,需要拿到第三系统返回的结果,我们以此来判断查插入我们自己数据库,并且返回给前台页面相对应的结果。你说的:我有点没明白的是:如果标识不去第二次请求,那时候这个线程拿的肯定是第二次的处理结果,那如何拿到第三系统第一次返回的结果。
注:第三系统结果会判断我们的请求中的唯一标示,如果两次中的唯一标识是一样的,第一次成功之后,第二次会返回重复插入。
我觉得直接解决请求超过10s这事比较靠谱,也简单一点。先返回一个结果,然后通过这个结果再进行业务处理后的最终结果。毕竟,你现在的方案徒增服务器负担,用户体验还不见得好。
这个暂时解决不了,老系统,然后还有请求第三方系统,返回的时间是不固定的。