WOPI集成Office Online 365:如何区分刷新与IFrame关闭的Unlock调用?
我之前在做WOPI和Office 365集成时也碰到过一模一样的问题,这个区分确实需要结合WOPI的机制和主应用的状态来判断,分享几个实用的方法:
结合主应用的用户会话状态判断
刷新操作是用户在主应用页面活跃状态下触发的,此时主应用中该用户的会话(比如Cookie、认证Token)应该是有效的,且主应用可以维护一个「当前编辑会话列表」,记录哪些用户正在编辑哪些文档。当收到Unlock请求时,先检查这个列表:如果该用户的编辑会话仍处于活跃状态,那大概率是刷新触发的;如果会话已经被标记为结束或者不存在,那就是IFrame关闭导致的。追踪Unlock后的Lock请求时序
用户点击刷新按钮时,WOPI客户端的逻辑通常是先发起Unlock,紧接着会重新发起Lock请求来获取新的编辑会话。所以可以在服务端记录每个Unlock请求的文档ID、用户ID,然后设置一个短时间窗口(比如5-10秒),如果在这个窗口内收到同一个用户针对同一文档的Lock请求,就可以判定之前的Unlock是刷新操作触发的;如果超时没有收到Lock请求,则判定为IFrame关闭。利用PostMessage做前端状态同步
在主应用和WOPI IFrame之间建立PostMessage通信监听:- 当用户点击WOPI客户端的刷新按钮时,WOPI会向主应用发送特定的消息(可以通过WOPI的事件回调获取),主应用收到后,给对应的文档会话标记一个「刷新中」的状态;
- 当IFrame即将关闭时,主应用可以监听IFrame的
beforeunload或者unload事件,将文档会话标记为「即将关闭」。
之后收到Unlock请求时,根据主应用中记录的状态就能直接区分触发原因。
结合TTL时间窗口辅助判断
你的场景里刷新提示是在TTL到期前几分钟弹出的,所以可以在服务端记录每个Lock的创建时间和TTL时长。当收到Unlock请求时,计算当前时间距离Lock到期的时间:如果处于你设置的「刷新提示窗口」内,结合前面的方法一起验证,就能更精准判断是否为刷新操作。
需要注意的是,单一方法可能存在误差(比如用户刷新后意外断网导致没有后续Lock请求),建议结合2-3种方法交叉验证,提升判断的准确性。
内容的提问来源于stack exchange,提问作者Rahul Rabhadiya

