如何在 sequence diagram 中设计 Logout 流程?
Logout 顺序图可以按“用户点击退出 → 系统使当前 session 失效 → 客户端清理登录状态 → 显示登录页”的顺序绘制。Logout 没有专用的 UML 符号,用生命线、调用消息和返回消息即可。
这里以使用服务端 session 的应用为例。采用 JWT、单点登录或其他认证机制时,需要相应调整结束登录状态的具体步骤。
先确定各参与者的职责
这五个参与者可以保留,其中 System 需要明确为具体的处理组件:
| 参与者 | 在流程中的职责 |
|---|---|
| User | 点击 Log Out |
| Settings Page | 接收点击事件,发起退出请求 |
| System | 处理退出请求,具体指退出控制器或应用服务 |
| Session Manager | 使当前 session 失效 |
| Login Screen | 在退出完成后显示登录入口 |
包含这些内部协作的是设计顺序图。如果作业要求画系统顺序图(System Sequence Diagram),通常只需展示 User 与整个系统的交互,不必展开内部的 Session Manager。
消息应按什么顺序排列?
假设用户已进入 Settings Page,流程可以从点击退出开始:
- User 向 Settings Page 发出“点击 Log Out”事件。
- Settings Page 向 System 发送
logout()请求。 - System 根据请求关联的当前 session,调用 Session Manager 的
invalidate(currentSession)。 - Session Manager 完成处理,向 System 返回结果。
- System 向 Settings Page 返回退出成功。
- 客户端清理登录状态,并导航到 Login Screen。
- Login Screen 向用户显示登录界面。
服务端完成 session 失效处理后,界面才按退出成功继续导航。仅仅打开登录页,不能说明原来的 session 已失效。
如果还要展示进入 Settings Page 的过程,可以在开头补上用户打开设置页、界面显示设置内容的消息。只关注 Logout 时,可以省略这些步骤。
PlantUML 示例
示例展示成功退出的流程。消息名称用于说明设计,不是某个框架的固定 API。
@startuml
actor User
boundary "Settings Page" as Settings
control "System\nLogout Controller" as System
participant "Session Manager" as Session
boundary "Login Screen" as Login
note over User, Settings
前提:用户已登录,且已打开 Settings Page
end note
User -> Settings : 点击 Log Out
activate Settings
Settings -> System : logout()
activate System
System -> Session : invalidate(currentSession)
activate Session
Session --> System : session 已失效
deactivate Session
System --> Settings : 退出成功
deactivate System
Settings -> Settings : 清理客户端登录状态
Settings -> Login : 导航到登录页
deactivate Settings
Login -> User : 显示登录界面
@enduml
“清理客户端登录状态”是一个概念步骤,可以包括清除前端保存的用户信息。如果认证凭据保存在 HttpOnly cookie 中,通常需要服务端通过响应清除 cookie,不能画成前端 JavaScript 直接读取并删除。
图中的 UML 表示法怎么理解?
- 生命线是参与者下方的竖向虚线,表示该参与者在这次交互中的存在。
- 调用消息中的同步调用通常用实线和实心箭头表示。示例中的
logout()、invalidate(currentSession)都是调用。 - 返回消息用虚线箭头表示,例如“session 已失效”和“退出成功”。返回消息可以省略,但初学时保留它们,更容易看清处理顺序。
- 激活条是生命线上的细长矩形,表示参与者正在执行行为。示例用
activate和deactivate表示。 - 自调用是参与者指向自身的消息。示例中,Settings Page 的自调用表示客户端内部执行清理操作。
时间沿生命线从上向下推进。阅读时看消息的先后关系即可,箭头之间的距离不代表精确耗时。
示例中的“导航到登录页”和“显示登录界面”是界面层面的抽象。要描述具体的 Web 请求,还需加入 Browser,画出浏览器接收重定向响应、请求登录页面的过程。服务端不会直接操控一个页面对象来完成 HTTP 重定向。
分支和容易画错的地方
Login 与 Sign Up 如何选择?
如果退出后固定进入 Login Screen,就只画登录页。注册入口可以作为登录页上的链接,无须展开注册流程。
如果需求规定了不同去向,可以用 alt 组合片段,并写清条件,例如 [目标页面为 Login] 和 [目标页面为 Sign Up]。只有满足条件的分支才执行,不要把两个页面画成先后执行的步骤。
session 失效是否要画销毁符号?
Session Manager 的生命线末尾不需要画 X。X 表示对应实例被销毁;退出登录通常只使某个 session 失效,Session Manager 仍会继续处理其他请求。
只有单独建模了某个 Session 对象,且设计确实会销毁该实例时,才考虑使用销毁消息。将 session 标记为失效,也不一定意味着销毁对象。
退出失败怎么办?
需要展示异常时,可以在处理结果处增加 alt:
[退出成功]:清理客户端状态,进入登录页。[退出失败]:向用户显示错误或提供重试入口。
请求发生网络超时时,客户端可能无法判断服务端是否已完成退出,因此不宜直接标注“session 已失效”。
对于 session 已过期或重复点击退出的情况,可以把退出操作设计为幂等:只要目标 session 已失效,就按退出完成处理。是否采用这一规则,由应用需求决定。
备注:内容仅供参考。
