get请求缓存问题

背景

最近开发一个需求,需要打开一个第三方的页面,在打开之前需要先使用get请求 header中携带认证信息,去对第三方系统进行调用认证,从而保证可以打开第三方的系统。

问题

需求开发完 却发现只有第一次是正常调用get请求进行认证的,后续再打开第三方的系统都是无效的,通过第三方系统的日志发现 后面并没有对第三方系统进行调用get请求认证。但是在项目里通过打断点和看控制台 network, 发现在打开第三方系统之前都进行了get请求,通过fiddler截到的日志也是显示调用了get认证请求。

原因

通过在部署项目的服务器抓包,发现除了第一次发起了get认证请求,后续的请求都没有发现调用get认证请求,于是就考虑是浏览器的问题了。此时就发现原因是出现在ajax的缓存了,在浏览器中,get请求是有缓存的,Ajax在发送的数据成功后,会把请求的URL和返回的响应结果保存在缓存内,当下一次调用Ajax发送相同的请求时,它会直接从缓存中把数据取出来,这是为了提高页面的响应速度和用户体验。当前这要求两次请求URL完全相同,包括参数。这个时候,浏览器就不会与服务器交互。
所以问题的原因就找到了,是因为第一次调用get鉴权请求成功,会把响应结果保存在缓存中,所以后续的get认证请求就走缓存了,发起了get请求,但是并没有调用到第三方平台的接口。

如何避免ajax get缓存
  1. 改为post请求

最直接的方式就是改为post请求,post不会有缓存,但是这种方式是不推荐的,可能接口就是get接口,不支持post请求。

  1. 拼接随机参数

ajax get请求缓存的一个前提就是url地址需要一致,才会走缓存,所以也可以通过拼接一个随机的参数来使得请求url不一致来避免缓存。 一般都是拼接?time=new Date().getTime(); 时间戳重复的情况几乎不可能出现

  1. 拼接header头信息

在发送的ajax请求中header中添加 “Cache-Control”:”no-cache” 参数配置

  1. jquery 封装的ajax添加传参

如果是使用的jquery封装的ajax,可以使用ajax提供的一个参数. cache设置为false

$.ajax({
          type: 'get',//get请求时
          url: '........',
          cache: false,//不缓存
          data: { },
          success: function (result) {
              //
          }
      });
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值