浏览器发送了两次请求给服务器,服务器只返回后一次请求的内容

浏览器调用同一个接口,发送了两次请求给服务器端,服务器端代码返回一个随机数给浏览器

框架是SpringMvc+Spring+MyBatis

服务器端代码如下:

@RequestMapping(value = "/test")
@ResponseBody
public Result test(){
    result.setSuccess(true);
    result.setData(new Random().nextDouble() + System.currentTimeMillis());
    return result;
}

chorme的network截图如下,发现两次请求返回的内容是同一个

  • 请求一
    clipboard.png

  • 请求二
    clipboard.png

有以下几个疑问:

  • 经过多次试验,发现请求是都走到Controller里,但是第一次请求的响应数据没有马上返回给浏览器端,而是和第二次请求的响应一起返回给了前端,并且第一次请求的响应内容居然是第二次响应的内容。

  • 有时候两次请求的响应能不相同,有时候却相同,不知道是什么原因。


分割线1

不少朋友说是因为我发的get请求,导致浏览器认为是缓存原因。

我的实际应用场景是,前台上传多个附件,但是本质是多次上传,然后由后台返回此文件在数据库中的文件id。然后我发现有时上传多个文件时,返回的文件id都是同一个。

如下图所示:两个上传的文件长度是不一样的

  • 文件一
    clipboard.png

  • 文件二
    clipboard.png

但是服务器返回的文件id却是一样的:

  • 文件一
    clipboard.png

  • 文件二
    clipboard.png


分割线2

我已经在URL上加了随机数,来区分是不同的请求,服务器的响应码是200,但是服务器返回的内容还是将第二次请求的响应内容覆盖掉了第一次响应内容

  • 文件一

    • 请求消息
      clipboard.png

    • 响应消息
      clipboard.png

  • 文件二

    • 请求消息
      clipboard.png

    • 响应消息
      clipboard.png

阅读 10.2k
7 个回答

浏览器请求的url后面加上防止缓存的时间戳试试

看了下评论,有可能就是那种情况,你看下响应码是多少,304的话就和上次相同。因为请求的url一样,所以浏览器使用的缓存数据,你可以在请求中加个随机参数(时间戳),保证每次的url不一致。

看下spring mvc controller的日志 看请求到达服务器的时间是否是同一毫秒

首长你又来了,你试试用System.nanoTime() 看看返回值。

由于缺失请求数据等重要信息(是GET请求还是POST请求?这两个请求是怎样发起的?相关的客户端代码是怎样写的?),所以以下仅为个人猜测:
1、你这两个请求几乎是同时向服务器发起的;
2、基于1的猜想,new Random().nextDouble() + System.currentTimeMillis()几乎可以认为差值不大(尤其是本地测试的时候);
3、你用了double来存储这个随机数,然后jackson在序列化double值的话有可能发生精度丢失(关于js的精度丢失问题请自行搜索),所以在客户端看起来你这两个值是一模一样的;

基于1的猜想,假想验证方法如下:

@RequestMapping(value = "/test")
@ResponseBody
public Result test(){
    result.setSuccess(true);
    result.setData(new Random().nextDouble() + System.currentTimeMillis());
    log.info(result.getData());
    return result;
}

看一下输出结果,并且把输出结果在浏览器里的console里用JSON.parse(log出来的数值)看一下是否一样。

解决方法:用字符串存储这个随机数,以下是我自己写的一个生成若干位随机数的方法(java8):

public static String generateRandomNum(int size) {
    return new Random().ints(size, 0, 10).boxed().map(String::valueOf).collect(Collectors.joining(""));
}

至于你分割线后的问题,没有代码,无法分析。

服务端,把请求的URL路径参数打印到控制台看看,应该两次请求打印到服务端是一模一样的,所以服务端当一个请求处理掉了。上面的System.nanoTime();方法可以都试试看。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏