为什么Chrome与Firefox中PHP Session值存在差异?
问题根因
你遇到的跨浏览器表现差异核心有两个原因:
- 代码逻辑存在缺陷:
my.php中每次被访问都会无条件将$_SESSION['temp']重置为0,只要存在多次并发/顺序错乱的my.php访问请求,就会把AJAX修改后的session值覆盖。 - Chromium内核浏览器(Chrome、Edge、安卓原生浏览器)的预加载策略更激进:符合HTTP规范幂等要求的GET请求会被浏览器提前发起预请求(用于提升页面加载速度),相当于你还没正式访问页面,浏览器已经偷偷请求了一次
my.php,这个预请求和你正式访问时的页面请求、AJAX请求的执行顺序错乱,就会出现AJAX改完10,又被预请求的my.php逻辑覆盖回0的问题。Firefox、Safari的预加载触发条件更严格,所以不会触发该问题;使用Cookie时也存在相同问题,是因为预请求也会携带和修改Cookie,同样会出现值被覆盖的情况。
解决方法
- 优化session初始化逻辑:不要每次访问
my.php都重置session值,仅在session未初始化时赋值
把my.php中原来的初始化代码改成:<?php session_start(); // 仅当temp不存在时才初始化,避免每次访问都重置 if (!isset($_SESSION["temp"])) { $_SESSION["temp"] = 0; } ?> - 修改AJAX请求方法:修改服务端数据的操作不要用GET请求,改成POST,Chromium不会对POST请求做预加载处理
调整AJAX代码:
对应修改function plusn(n) { $.ajax({ url: 'myajax.php', type: 'post', // 把参数放到body里,不要拼在URL上 data: {n: n}, async: false, success:function(result){ $("#t").append(result) } }); }myajax.php的取值逻辑:<?php session_start(); // 改成从POST取参数 $_SESSION["temp"] += $_POST["n"]; exit('$_SESSION["temp"] = '.$_SESSION["temp"].'<br>'); ?> - 给页面添加禁止缓存的响应头:避免浏览器缓存页面逻辑导致异常,在
my.php的session_start()后添加以下代码:header('Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate'); header('Pragma: no-cache'); header('Expires: 0');
内容的提问来源于stack exchange,提问作者鄭小火
相关产品推荐
相关产品推荐

