当前位置: 首页 > 后端技术 > Java

当浏览器中的多个tab发送同一个请求时

时间:2023-04-01 23:04:33 Java

之所以会这样,是因为新开发者在controller中写了一个阻塞请求,直接使用了while(true),抛出异常时里面就跳出了条件从来没有遇到过。(当然我们是在提交代码的时候发现的)所以我们研究了它会对程序产生怎样的影响。首先,我们的理论知识是,当tomcat收到一个请求时,会从线程池中拿一个空闲线程来处理这个请求,所以死循环仅限于当前线程,当有另一个请求时,它会也是一个新的线程,所以请求不会响应,但是不会导致程序直接挂掉(tomcat最多可以分配200个线程,持有少量的请求自己测试)。所以当我打开两个浏览器标签页同时发送同一个请求时,查看控制台显示。线程确实不一样,但是为什么请求时间相差20多秒呢?一开始以为是自己的理论知识有问题,思考了一会儿,又打开了一个新的浏览器,再次尝试。一个请求用edge发送,一个用chrome发送。此时两次请求的时间间隔就是按回车的时间差。所以浏览器内部肯定有某种机制可以防止多个标签页向同一个url发送请求(阻塞)。查资料,上面有解决方法。1.只要禁用浏览器的缓存,你会发现没有序列化问题。此时多个请求同时发起,5s后同时结束。2.如果没有关闭浏览器的缓存,浏览器期望同一个URL服务器返回304响应,可惜第一次响应的内容没有缓存,所以每次请求都是串行的,执行顺序是5s+5s+5s,但是如果浏览器发送了缓存响应,那么第一次执行是5s,然后就全部缓存了,所以执行顺序是5s+0+0。总结一下,这个函数其实就是为网页上的图片准备的。上述逻辑也存在一些漏洞。其实应该有个超时时间。在超时时间内,它会阻塞,超时后,会发起新的请求。打开edge下的开发者页面,点击设置,于是试了一下,打开3个tab同时打开开发者页面,后台确实可以直接响应。所以造成这种现象的原因是浏览器会缓存大文件/图片来提高加载速度。找到的信息的原始地址也看起来像一个翻译页面。浏览器中多个标签页打开同一个URL序列化的问题-LaruenceCorner(laruence.com)