修改$_SESSION后如何重载网站所有已打开页面?
解决修改SESSION后同步所有打开页面的问题
原方案失效原因
你当前用window.postMessage的方式无法生效,核心问题有两个:
window.postMessage仅向当前窗口发送消息,但你在发送后立刻跳转了当前页面,页面被卸载后消息无法传递给其他标签页;postMessage本身不支持广播到所有同源标签页,必须明确指定目标窗口引用,这在多标签页场景下很难实现。
修复方案(广播消息到所有同源标签页)
方案1:使用Broadcast Channel API(现代浏览器推荐)
这是HTML5专门用于同源标签页/窗口间通信的API,使用简单且高效。
发送端代码修改
$('#virtual_user_data').on('click', function(){ var user_type = $('#select_user_type').val(); var user_id = $('#select_user').val(); $.ajax({ url: 'include_php/impersonate.php', async: false, data : {'user_type_id' : user_type, 'user_id' : user_id}, type : 'POST', success : function(data){ // 创建广播频道并发送重载指令 const sessionChannel = new BroadcastChannel('session-update-channel'); sessionChannel.postMessage({ type: "reload" }); sessionChannel.close(); // 跳转对应页面 if (user_type == 3) window.location.href = 'home_provider.php'; else if (user_type == 2) window.location.href = 'home.php'; } }); });
接收端reload.js修改
// 监听广播频道消息 const sessionChannel = new BroadcastChannel('session-update-channel'); sessionChannel.onmessage = function(event) { if (event.data.type && event.data.type === "reload") { location.reload(); } };
方案2:使用localStorage的storage事件(兼容旧浏览器)
利用localStorage的storage事件,当某个标签页修改localStorage时,其他同源标签页会触发该事件,以此实现广播。
发送端代码修改
$('#virtual_user_data').on('click', function(){ var user_type = $('#select_user_type').val(); var user_id = $('#select_user').val(); $.ajax({ url: 'include_php/impersonate.php', async: false, data : {'user_type_id' : user_type, 'user_id' : user_id}, type : 'POST', success : function(data){ // 修改localStorage触发跨标签页事件 localStorage.setItem('session-reload-signal', Date.now().toString()); // 跳转对应页面 if (user_type == 3) window.location.href = 'home_provider.php'; else if (user_type == 2) window.location.href = 'home.php'; } }); });
接收端reload.js修改
// 监听localStorage变化 window.addEventListener('storage', function(event) { if (event.key === 'session-reload-signal') { location.reload(); } });
无需重载页面的SESSION同步方案
如果不想重载整个页面,可以尝试以下方式:
- 定期轮询校验:前端每隔一段时间(如30秒)通过ajax请求后端接口,获取当前SESSION的用户信息,与前端缓存的信息对比,若不一致则更新页面数据;
- WebSocket实时推送:后端使用WebSocket与前端保持长连接,当管理员修改模拟用户后,后端主动向前端所有连接推送SESSION更新事件,前端收到后直接更新页面数据,无需重载。这种方式实时性最好,适合频繁切换模拟用户的场景。
内容的提问来源于stack exchange,提问作者Roberto García
相关产品推荐
相关产品推荐

