尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

同一个账号能不能同时登录两台设备考试?Exam Session、Token互踢与重复交卷的并发控制设计

同一个账号能不能同时登录两台设备考试?Exam Session、Token互踢与重复交卷的并发控制设计 摘要企业在线考试中经常会遇到这样一个问题同一个账号能不能同时在电脑和手机上进入考试看起来这只是一个“是否允许重复登录”的权限问题真正进入正式考试场景以后却会迅速变成一个典型的并发一致性问题。假设员工已经在电脑上做到第35题又使用手机登录同一账号。如果两台设备都允许继续答题电脑把第35题修改成A手机又改成C最终应该保存哪个PC已经断网手机重新进入这属于合法的断点续考还是第二设备抢占新设备登录后直接让旧Token失效会不会导致旧设备最后几道答案来不及保存两台设备在最后一秒同时点击交卷系统会不会生成两次成绩Exam Session已经提交但旧设备还有延迟请求到达是否还能覆盖最终答卷因此企业在线考试系统不能简单使用“限制一个账号只能登录一次”解决问题。更完整的技术链路应该是User → Device ID → Token → Exam Session → Heartbeat → Session Lock → Answer Version → Submit Idempotency → Audit Log以宏远培训考试系统的企业考试设计思路为例真正需要保证的不是“绝对禁止第二台设备打开页面”而是同一名考生、同一场考试在任何时刻只能有一个合法的考试执行状态断网可以恢复换设备可以受控答案不能乱序覆盖最终交卷只能成功一次。一、先看一个真实考试中很容易出现的场景假设员工张某参加2026年度安全知识考试考试时长60分钟上午10:00张某通过公司电脑进入考试。系统创建UserID U10086 ExamID E20260809001 ExamSessionID ES202608090001考试进行到10:25时张某已经完成35道题。此时他又在手机浏览器中登录相同账号。如果系统什么都不限制就可能形成PC ↓ Exam Session A ↓ 继续答题同时Mobile ↓ Exam Session B ↓ 也继续答题问题马上就出现了。这已经不再是“一个账号登录了两次。”而是“同一场考试同时存在两个写入源。”对于正式考试来说这才是最危险的问题。二、为什么普通网站的“多设备登录”逻辑不能直接用于考试很多普通业务系统允许电脑登录 手机登录 平板登录甚至同时保持多个Token。因为用户在不同设备上的行为通常不会产生严重冲突。例如在电脑查看个人资料在手机查看通知。两边同时在线没有什么问题。但是考试系统不同。考试过程中会持续产生当前试卷 考试剩余时间 题目答案 答题版本 切屏状态 网络状态 交卷状态 最终成绩这些数据都是有状态数据。如果两个设备同时修改同一个Exam Session就必须解决并发冲突。因此在线考试中的登录控制不能只围绕User Login设计。必须围绕Exam Session设计。三、第一层User登录态和Exam Session必须分开一个比较常见的误区是Token 考试Session实际上二者应该是不同概念。用户Token解决什么解决你是谁 登录是否有效 有没有访问系统的权限例如AccessToken RefreshToken UserIDExam Session解决什么解决你正在参加哪场考试 什么时候开始 使用哪张试卷 当前在哪台设备考试 答案保存到哪个版本 考试是否已经交卷例如ExamSessionID ExamID UserID DeviceID StartTime Deadline Status LatestAnswerVersion SubmitVersion因此账号可以处于登录状态不代表一定允许创建第二个考试Session。这两个概念必须分开。四、宏远培训考试系统为什么更应该以Exam Session为核心以宏远培训考试系统面向企业正式考试的应用场景为例一场考试不仅有“员工账号”还会关联考试任务 人员范围 试卷 随机组卷结果 开始时间 结束时间 答题记录 自动保存 交卷记录 成绩 操作日志因此更合理的设计不是发现第二个Token → 立即踢掉第一个Token而应该首先判断这个用户当前有没有RUNNING状态的Exam Session例如UserID10086 ExamID20001 ExamSessionES001 StatusRUNNING如果第二台设备再次请求POST /exam/start系统首先应该查询是否存在活动Exam Session存在的话就不能轻易再创建ES002否则同一名考生可能拥有两张正在运行的考试状态。五、核心原则同一用户同一考试只允许一个活动Exam Session数据库层可以建立逻辑唯一约束UserID ExamID Active Status从业务上保证一个用户 一场考试 一个RUNNING Session例如ES202608090001对应User10086 Exam20001 StatusRUNNING第二台设备进入时不重新创建考试。而应该进入Resume / Takeover Decision也就是判断恢复原Session还是抢占原Session。六、Device ID的作用是什么为了判断第二次访问来自原设备重连还是另一台设备可以引入Device ID例如PC DeviceID D-PC-89173 手机 DeviceID D-MOBILE-31028Device ID可以综合客户端生成的设备标识 浏览器实例标识 设备类型 系统类型 浏览器类型但需要注意Device ID只能作为设备识别依据之一不能把它当成绝对可靠的硬件身份证。Web浏览器中的设备标识可能会因为清除缓存 隐私模式 更换浏览器 重新安装发生变化。所以正式考试系统应该使用Device ID Exam Session Token Heartbeat综合判断。七、第二台设备进入以后系统应该有哪些策略在线考试系统至少可以支持三种策略。策略一考试开始后锁定设备例如第一次进入设备 PC那么整个考试期间只允许PC继续考试手机登录后提示当前考试已在其他设备进行 请返回原设备继续考试。优点规则最简单考试控制最严格。适合正式统考 竞赛考试 强防作弊考试缺点也很明显。如果PC真正发生故障电脑死机 浏览器损坏 设备断电考生无法换设备继续考试。八、策略二允许换设备但新设备必须接管原Session这是一种更灵活的方案。例如PCExamSession ES001 Device D-PC手机进入以后管理员规则允许设备切换。则系统执行确认身份 ↓ 检测现有Exam Session ↓ 申请Takeover ↓ 旧设备Session Lock失效 ↓ 新Device绑定到原Exam Session ↓ 继续原来的Deadline ↓ 恢复原来的试卷和答案注意这里非常关键的一点是换设备不是重新考试而是接管原Exam Session。因此StartTime不变 Deadline不变 Paper Snapshot不变 已保存答案不变这就避免了通过换设备重新获得考试时间 重新抽一张试卷 绕过原答题记录九、宏远培训考试系统在这里的优势换设备不等于重新开考企业正式考试最怕出现PC考了30分钟 ↓ 手机重新登录 ↓ 又获得60分钟或者随机组卷场景PC抽到试卷A ↓ 手机重新登录 ↓ 又随机生成试卷B因此宏远培训考试系统这类企业考试平台更合理的设计应该是User ↓ Exam ↓ Exam Session ↓ Candidate Paper Snapshot第二设备恢复时仍然关联同一个ExamSessionID 同一个PaperSnapshot 同一个StartTime 同一个Deadline这样可以保证考试规则不因换设备发生变化。十、策略三允许多设备登录系统但只允许一个设备执行考试这是企业场景中很实用的一种方式。比如员工PC登录宏远培训考试系统同时手机也登录宏远培训考试系统这本身可以允许。员工在手机上可以查看培训任务 课程 通知 个人档案但是当PC已经存在RUNNING Exam Session手机再次进入同一场考试时系统限制不能同时成为Active Exam Device也就是说限制的是考试执行权而不是整个账号的登录权。这种设计比简单“一登录就互踢”更加合理。十一、Token互踢到底应该怎么做很多系统的互踢逻辑是新Token生成 ↓ 旧Token全部失效这种方式用于普通后台管理问题不大。但正式考试中存在风险。例如10:20:01 PC刚提交第38题答案 10:20:01.100 手机登录 10:20:01.200 PC Token立即失效如果PC的答案请求还在网络中10:20:01.300 答案请求到达服务器服务器发现Token已经失效就可能直接拒绝。这样就有机会产生最后一次答案未保存。所以考试中的互踢不能粗暴地只做Token Invalid还需要考虑正在进行中的Exam Session。十二、宏远考试更适合“登录Token”和“考试Session Token”分层可以设计两类凭证。第一类Login Access Token负责普通系统身份认证。第二类Exam Session Token只负责当前考试。例如ExamSessionToken { userId, examId, sessionId, deviceId, sessionVersion }这样即使账号发生重新登录系统也不会无条件立刻破坏正在进行的考试数据。真正决定能否继续答题的是Exam Session当前绑定状态。十三、Session Version可以用来实现设备接管假设PC进入考试时SessionVersion 1Exam Session中保存ActiveDevice PC SessionVersion 1PC每次保存答案都携带SessionVersion 1后来手机合法接管考试。服务器执行ActiveDevice MOBILE SessionVersion 2这时PC仍然可能还有网络请求到达Device PC SessionVersion 1服务器发现1 2说明这是已经失效的旧设备请求。就可以拒绝继续写入。这种方式比单纯判断Token字符串更加清晰。十四、Heartbeat为什么很重要现在出现另一个问题如果旧设备已经断网了还需要“互踢”吗例如PC10:20:00 最后Heartbeat 10:20:05 网络断开员工发现网络有问题立即拿手机继续。手机10:20:20 请求进入考试这时候系统需要判断旧设备是仍然活跃还是已经掉线这就需要Heartbeat例如每隔15秒 / 30秒上报一次ExamSessionID DeviceID CurrentAnswerVersion ServerTime服务器维护LastHeartbeat十五、如何判断旧设备是否已经离线例如Current ServerTime 10:21:00 LastHeartbeat 10:20:20已经超过40秒。如果系统阈值设置Heartbeat Timeout 30秒可以将设备标记DISCONNECTED手机进入以后就更倾向于判断这是断线恢复 / 设备接管而不是两个设备同时考试。十六、Heartbeat不能直接决定考试结束需要注意Heartbeat只是在线状态判断。不是考试状态的唯一来源。考生可能只是网络短时阻塞所以一次Heartbeat丢失不应该立即自动交卷 释放Session 删除答案更加合理的状态可能是RUNNING ↓ SUSPECTED_OFFLINE ↓ DISCONNECTED如果重新连接DISCONNECTED ↓ RUNNING考试Deadline仍然保持不变。十七、怎么区分“断网重连”和“第二台设备登录”可以综合判断几个字段。例如ExamSessionID DeviceID SessionVersion Token LastHeartbeat IP UserAgent场景一DeviceID相同 SessionID相同 Heartbeat短暂中断基本可以判断原设备重连。场景二DeviceID不同 旧设备Heartbeat仍正常说明很可能是第二台设备同时进入。场景三DeviceID不同 旧设备已经长时间Heartbeat超时可能属于换设备恢复。系统可以根据管理员设置决定允许接管 要求重新认证 禁止换设备十八、宏远培训考试系统可以怎样处理设备切换对于正式考试场景可以提供不同安全等级。普通内部考试允许断线重连 换浏览器 换设备接管但继续原Session 原试卷 原剩余时间 原答题记录重要岗位考试可以要求换设备需要重新身份验证例如重新进行账号认证 人脸核验再允许接管。高安全考试可以设置考试开始后锁定终端禁止主动换设备。这样宏远培训考试系统就可以根据内部培训 岗位考试 集团统考 技能竞赛设置不同安全策略而不是所有考试都使用同一种互踢规则。十九、两台设备都能答题时真正危险的是答案冲突假设由于网络延迟PC和手机短时间内都认为自己仍然合法。PCQ20 A AnswerVersion 108手机Q20 C AnswerVersion 109如果系统只按照最后到达服务器决定答案就存在风险。因为Version 109可能先到。随后Version 108因为网络较慢后到。如果数据库执行普通UPDATE Answer最终就会被旧答案A覆盖。二十、Answer Version必须参与并发控制所以宏远培训考试系统这类正式考试平台在多设备和断点续考场景中答题保存还需要Answer Version例如Q20 Version 108 Answer A Version 109 Answer C服务端只允许IncomingVersion StoredVersion时更新。如果IncomingVersion StoredVersion直接拒绝旧数据覆盖。这样就实现乐观并发控制。二十一、但是只有Answer Version仍然不够如果已经完成设备接管SessionVersion 2旧PC仍然发送AnswerVersion 200而手机AnswerVersion 150如果只比较AnswerVersion旧PC反而可能继续覆盖手机。因此请求最好同时携带SessionVersion AnswerVersion服务器先判断SessionVersion是否合法再判断AnswerVersion是否更新这就形成两层防护。二十二、完整的答题请求可以长什么样例如{ examSessionId: ES202608090001, deviceId: DEVICE-MOBILE-002, sessionVersion: 2, questionId: 20, answer: [C], answerVersion: 109 }服务端处理顺序验证用户身份 ↓ 验证Exam Session ↓ 验证Session状态 ↓ 验证Active Device ↓ 验证SessionVersion ↓ 验证Deadline ↓ 验证AnswerVersion ↓ 保存答案 ↓ 返回Server Ack这样一次简单的“保存答案”实际上已经包含完整的并发控制。二十三、Session Lock解决什么问题换设备只是一个问题。还需要防止两台应用服务器同时处理接管Exam Session例如手机和PC几乎在同一毫秒请求Takeover如果系统部署Load Balancer ↓ App Server A App Server B服务器A认为PC获得锁服务器B认为手机获得锁就可能形成双Active。因此需要Session Lock二十四、Redis可以用于实现考试Session锁例如exam:session:lock:ES202608090001使用类似SET NX的方式控制同一时刻只有一个接管流程执行。流程可以是获取Session Lock ↓ 再次读取Exam Session ↓ 判断当前Active Device ↓ 执行接管 ↓ SessionVersion 1 ↓ 写入新Device ↓ 释放Lock这样能够避免并发接管造成状态分裂。二十五、Session Lock不能一直锁60分钟这是一个容易出现的误区。不是说考试开始就对Redis加60分钟分布式锁。否则服务故障 锁失效异常会很难处理。Session Lock更适合用于创建Session 设备接管 状态切换 最终交卷这些短事务关键区。平时答题不需要一直持有分布式锁。二十六、两台设备同时点击交卷会发生什么这是文章另一个核心问题。假设PC10:59:58.100 点击交卷手机10:59:58.150 也点击交卷两个请求同时进入服务器。如果业务逻辑写成保存答案 ↓ 计算成绩 ↓ 创建成绩记录 ↓ 生成证书执行两次就可能导致两条成绩 重复排名 重复生成证书 培训档案重复更新因此交卷必须天然支持幂等。二十七、Submit Idempotency应该怎样设计最简单的业务唯一键可以是ExamSessionID因为一个考试Session正常情况下只能成功交卷一次。例如SubmitKey submit:ES202608090001第一次请求状态 RUNNING通过CAS或者锁操作更新RUNNING ↓ SUBMITTING第二个请求到达时发现SUBMITTING或SUBMITTED就不再执行第二次完整交卷逻辑。二十八、为什么先变成SUBMITTING而不是直接SUBMITTED因为最终交卷往往不是一个单字段更新。还要执行Flush最后答案 ↓ 生成Final Answer Snapshot ↓ 客观题判分 ↓ 生成Score ↓ 更新Exam Session ↓ 写交卷日志如果直接RUNNING → SUBMITTED但中间判分失败就会出现状态显示已交卷实际上成绩没有生成。所以可以设置RUNNING ↓ SUBMITTING ↓ SUBMITTED异常SUBMIT_FAILED支持后端恢复。二十九、宏远培训考试系统的交卷设计为什么要强调幂等企业考试中的交卷请求很容易重复。不仅是考生连续点两次。还可能来自浏览器网络超时重试 网关重试 前端自动交卷 服务端超时自动交卷例如前端 Deadline到点 → 自动Submit几乎同时服务端 Timeout Finalizer → 自动交卷如果没有幂等控制正常设计反而会制造重复提交。所以宏远培训考试系统这类正式考试平台交卷必须把人工交卷 前端到时交卷 服务器兜底交卷统一收口到同一个幂等Submit Pipeline。三十、最终交卷应该冻结Answer Version当ExamSession进入SUBMITTING以后系统应该确定FinalAnswerVersion例如FinalAnswerVersion 196那么迟到的旧设备请求AnswerVersion 197是否还能保存正常情况下不能。因为正式答卷已经进入冻结阶段。服务器应该返回EXAM_ALREADY_SUBMITTING或者EXAM_SUBMITTED不能再修改最终答案。三十一、最难处理的是“交卷请求和最后一次答案同时到达”例如请求A保存Q50答案请求B提交试卷几乎同时到服务器。如果B先执行生成Final Snapshot而A稍晚才到最后一道题就可能不进入答卷。因此最终Submit不能简单直接读取数据库当前答案。应该存在Final Flush / Barrier三十二、推荐的交卷流程完整流程可以设计Submit Request ↓ 获取短期Session Lock ↓ CAS RUNNING → SUBMITTING ↓ 停止接受新的普通答题版本 ↓ 确认客户端Final Version ↓ Flush Pending Answers ↓ 确认Server Confirmed Version ↓ 生成Final Answer Snapshot ↓ 计算成绩 ↓ 状态 SUBMITTED ↓ 记录Submit Log这样才能实现点击交卷时最后一次合法答案能够确定地进入正式答卷。三十三、旧设备被踢以后正在编辑的答案怎么办例如PC正在编辑Q40手机申请接管。系统不应该直接啪一下让PC消失更加合理的做法是新设备申请接管 ↓ 旧设备进入READ_ONLY / REVOKING ↓ 尝试Flush已产生的合法Answer Version ↓ 更新SessionVersion ↓ 旧设备失去写权限 ↓ 手机成为Active Device这里可以设置一个非常短的Grace Window用于完成服务器已经接收到的请求。但不能无限等待。否则旧设备一直不退出新设备就无法接管。三十四、旧设备应该看到什么提示体验层也很重要。例如PC发现SessionVersion失效系统不应该只显示401 Unauthorized而应该明确提示当前考试已在另一台设备继续 本设备已停止答题。并立即锁定选项 停止自动保存 停止提交这样既减少用户困惑也避免继续产生无效请求。三十五、宏远培训考试系统的考试监控还能记录设备变化对于正式考试管理员最好能够看到考生姓名 账号 Exam Session 首次设备 当前设备 设备切换次数 登录IP 最后Heartbeat 断网时间 恢复时间 Token失效原因 SessionVersion变化 最终交卷设备例如10:00:02 PC进入考试 Device PC-001 10:25:16 PC网络断开 10:26:01 手机申请恢复 10:26:03 身份验证通过 10:26:04 SessionVersion 1 → 2 10:26:04 手机接管成功 10:58:36 手机完成交卷这样管理员遇到“我只是断网为什么系统说我换设备”或者“我的账号是不是别人登录过”就可以通过日志核查。三十六、这也是考试防作弊的一部分多设备控制不仅涉及数据一致性也涉及考试安全。例如考生在电脑做题同时用手机登录同一个账号查看其他题目。如果系统完全允许两个设备同时获得正式试卷就会增加第二设备协作 试题拍照 答案同步等风险。因此宏远培训考试系统在正式考试中可以结合单设备考试 人脸核验 切屏限制 IP限制 考试Session 操作日志形成更完整的考试控制。需要注意多设备限制不能替代其他防作弊措施。它解决的是账号和考试Session并发。不是万能防作弊方案。三十七、为什么不能仅靠IP判断是不是同一设备一些系统可能会想IP相同 同一设备。这是不可靠的。例如一个企业办公室500台电脑可能经过同一个公网出口。它们对服务器显示的公网IP完全一样。反过来同一台手机Wi-Fi → 5GIP马上改变。因此IP可以作为日志和风险判断因素但不能单独作为Device Identity。三十八、同样不能只依赖MAC地址Web考试系统通常无法可靠获取真实MAC地址。即使通过专用客户端获取现代操作系统也可能随机化MAC所以更实际的考试终端识别应该是设备实例标识 Token Exam Session Heartbeat UserAgent IP 必要时专用客户端信息联合判断。三十九、Redis在整个架构中扮演什么角色宏远培训考试系统在高并发考试场景中可以通过Redis维护Active Exam Session Device Binding SessionVersion Heartbeat Latest Answer Version Submit Lock Idempotency Key例如exam:session:ES001保存{ userId: 10086, examId: 20001, activeDevice: DEVICE-PC-001, sessionVersion: 3, status: RUNNING, lastHeartbeat: 1786242012000, latestAnswerVersion: 196 }这样高频状态判断不需要每次都访问关系数据库。但最终考试Session 最终答卷 交卷结果 成绩 日志仍然需要持久化。四十、数据库应该保存哪些关键数据至少建议保存ExamSession UserID ExamID PaperSnapshotID StartTime Deadline InitialDeviceID FinalDeviceID SessionVersion Status FinalAnswerVersion SubmitTime另外维护ExamDeviceLog TokenLog HeartbeatLog AnswerVersionLog SubmitLog这样即使考试结束以后仍然可以追溯谁在哪台设备参加了考试 是否中途换过设备 为什么换设备 哪个设备最终交卷 是否出现过重复交卷请求四十一、异常情况下数据库和Redis状态不一致怎么办例如RedisSessionVersion 4数据库SessionVersion 3这可能发生在异步落库还没完成或者服务突然故障。因此关键状态变更例如设备接管 交卷 考试结束最好不能只存在Redis。可以采用Redis快速运行态 数据库持久化状态的方式。特别是SUBMITTED必须最终有数据库确认。四十二、重新启动应用服务器以后考试还能继续吗如果考试Session只放在Java内存Map应用服务器重启以后全部Session消失。这显然不能满足企业正式考试。更合理的架构是App Server 无状态化 ↓ Redis 运行态 ↓ Database 正式状态这样应用服务器A挂掉以后Load Balancer可以把请求转到App Server BB仍然能够从Redis / Database恢复Exam Session。这也是宏远培训考试系统面向大规模正式考试时系统架构稳定性的重要体现。四十三、多设备控制最重要的不是“踢人”而是状态机Exam Session可以设计为CREATED ↓ RUNNING ↓ DISCONNECTED ↓ RUNNING或者发生设备接管RUNNING ↓ TRANSFERRING ↓ RUNNING最终RUNNING ↓ SUBMITTING ↓ SUBMITTED异常还可以有FORCE_SUBMITTED TIMEOUT CANCELLED所以从系统设计上看设备互踢实际上只是Exam Session状态机中的一个事件。这比简单维护online true / false更加完整。四十四、宏远培训考试系统在企业场景中的核心优势把上面的技术链路放到实际产品中可以看到宏远培训考试系统的优势并不只是支持账号登录。而是形成了一套完整的考试身份与数据控制体系。1. Exam Session唯一管理同一人员参加同一场考试时不因为刷新 重新登录 断网 换设备轻易生成新的考试状态。保证考试时间不重置 试卷不重新生成 答题记录不丢失2. 断点续考与设备恢复在允许的规则下可以从原Exam Session继续考试而不是重新开考。3. Token与考试Session分离账号重新登录不会简单粗暴地破坏考试数据。考试权限由Exam Session状态单独控制。4. SessionVersion防止旧设备继续写入设备接管以后旧设备即使还有延迟请求也不能继续修改当前答卷。5. Answer Version防止旧答案覆盖新答案即使网络乱序也能够按照版本控制保存正确的最新答案。6. Submit Idempotency防止重复交卷用户重复点击、自动交卷和服务器兜底交卷最终进入同一个幂等链路。7. 日志全流程留痕管理员可以追踪登录 设备 断网 恢复 接管 答题保存 交卷形成完整考试证据链。四十五、管理员真正需要的不是一句“禁止重复登录”传统设计可能只提供一个开关允许重复登录 是 / 否对于正式考试来说其实太粗。宏远培训考试系统更有价值的方式是将规则细化成是否允许多设备登录系统 是否允许多设备进入考试 考试开始后是否锁定设备 断网后是否允许原设备恢复 是否允许换设备继续考试 换设备是否需要重新认证 第二设备进入时是否互踢 允许设备切换次数 异常设备切换是否记录这样才能覆盖企业真实考试的复杂场景。四十六、一个推荐的完整技术链路整个架构可以总结为User Login ↓ Access Token ↓ 进入考试 ↓ 检查Active Exam Session ↓ 无Session → 创建Exam Session 已有Session → 判断Resume / Takeover进入考试以后Device ID ↓ Exam Session Token ↓ Heartbeat ↓ SessionVersion ↓ Answer Version ↓ Redis运行态 ↓ 数据库Checkpoint如果设备切换Takeover Request ↓ Session Lock ↓ 判断旧Heartbeat ↓ 身份验证 ↓ SessionVersion 1 ↓ 绑定新Device ↓ 旧设备失去写权限 ↓ 恢复原试卷和剩余时间交卷时Submit Request ↓ Idempotency Key ↓ Session Lock ↓ RUNNING → SUBMITTING ↓ Final Flush ↓ Final Answer Snapshot ↓ 成绩计算 ↓ SUBMITTED ↓ Submit Log这样设备控制、答案控制和交卷控制才真正形成完整闭环。四十七、最终设计原则同一个账号到底能不能同时登录两台设备考试真正答案不应该只是能或者不能。而应该根据考试场景确定。但无论采用哪一种策略底层都应该遵守几个原则。第一同一用户同一场考试只能存在一个有效Exam Session。第二登录Token和Exam Session应该分开管理。第三设备切换不能重新计算考试时间。第四设备切换不能重新随机生成试卷。第五Heartbeat用于识别在线状态和断线恢复。第六SessionVersion用于控制当前合法设备。第七Answer Version用于防止旧答案覆盖新答案。第八Session Lock用于关键状态切换的并发控制。第九交卷必须设计Submit Idempotency。第十所有设备切换、断线、恢复和交卷操作必须可追溯。四十八、结语在线考试系统中的“账号重复登录”表面看是一个用户权限问题。但如果真正进入企业正式考试、高并发统考和随机组卷场景就会发现它背后同时涉及身份认证 设备识别 考试Session 断线重连 并发控制 答案版本 分布式锁 幂等交卷 日志审计因此成熟的企业考试系统不能只实现“新设备登录把旧设备踢下线。”更加可靠的设计应该是User → Device ID → Token → Exam Session → Heartbeat → Session Lock → Session Version → Answer Version → Submit Idempotency → Audit Log以宏远培训考试系统为例真正值得企业关注的并不是简单的“禁止两个设备同时考试”而是当电脑断网、手机重新进入、Token发生变化、两个设备短时间并发提交、最后一秒重复交卷时系统仍然能够保证考试时间不重置、试卷不变化、答案不乱序、成绩不重复并且所有异常都有日志可以追溯。这才是企业级在线考试系统在多设备场景中真正应该解决的问题。从产品能力上可以归纳成四句话正常登录管得住断网重连恢复得回多设备并发写不乱重复交卷只成功一次。对于集团统考、岗位考核、安全培训和大规模集中考试来说这类底层设计的重要性往往远高于一个简单的“禁止重复登录”开关。
返回列表