服务器端代码如下:
@RequestMapping(value = "/test")
@ResponseBody
public Result test(){
result.setSuccess(true);
result.setData(new Random().nextDouble() + System.currentTimeMillis());
return result;
}
chorme的network截图如下,发现两次请求返回的内容是同一个
请求一
请求二
经过多次试验,发现请求是都走到Controller里,但是第一次请求的响应数据没有马上返回给浏览器端,而是和第二次请求的响应一起返回给了前端,并且第一次请求的响应内容居然是第二次响应的内容。
有时候两次请求的响应能不相同,有时候却相同,不知道是什么原因。
我的实际应用场景是,前台上传多个附件,但是本质是多次上传,然后由后台返回此文件在数据库中的文件id。然后我发现有时上传多个文件时,返回的文件id都是同一个。
如下图所示:两个上传的文件长度是不一样的
文件一
文件二
但是服务器返回的文件id却是一样的:
文件一
文件二
文件一
请求消息
响应消息
文件二
请求消息
响应消息
浏览器请求的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的猜想,假想验证方法如下:
看一下输出结果,并且把输出结果在浏览器里的console里用JSON.parse(log出来的数值)看一下是否一样。
解决方法:用字符串存储这个随机数,以下是我自己写的一个生成若干位随机数的方法(java8):
至于你分割线后的问题,没有代码,无法分析。
服务端,把请求的URL路径参数打印到控制台看看,应该两次请求打印到服务端是一模一样的,所以服务端当一个请求处理掉了。上面的System.nanoTime();方法可以都试试看。