1. 直接访问 /cas/logout**(前端)**
最简单的方式是让前端浏览器重定向到 CAS 的登出 URL:
window.location.href = "https://cas.example.org/cas/logout";
或通过超链接:
<a href="https://cas.example.org/cas/logout">退出登录</a>
效果:
- CAS Server 会清除自身的会话(Session)。
- 如果配置了 单点登出(SLO),CAS 会尝试通过回调或前端重定向通知所有已登录的客户端应用(需客户端支持)。
2. 带参数的登出(自定义回调)
CAS的 /cas/logout 支持以下参数:
- service(可选):登出后重定向的 URL(需在 CAS 白名单中配置)。
- url(可选):同
service(某些版本支持)。
示例:
window.location.href = "https://cas.example.org/cas/logout?service=https://your-app.com/logged-out";
或通过表单提交:
<form action="https://cas.example.org/cas/logout" method="post">
<input type="hidden" name="service" value="https://your-app.com/logged-out" />
<button type="submit">退出登录</button>
</form>
注意:
- 客户端应用需在 CAS Server 的 服务管理(Service Management) 中配置允许的
service回调地址。 - 如果客户端需要清除本地会话,需在重定向到
service的页面中处理(如删除 Cookie 或 Token)。
3. 后端调用 /cas/logout
CAS 的 /cas/logout 通常依赖浏览器重定向或回调通知客户端,直接通过后端 HTTP 请求调用无效(因为无浏览器上下文)。但可以通过以下方式间接实现:
方案:
- 后端提供一个登出接口(如
/api/logout)。 - 接口内清除本地会话(如删除 Session/Token)。
- 返回重定向指令给前端,由前端跳转到 CAS 的
/cas/logout。
示例(Spring Boot):
@GetMapping("/logout")
public String logout(HttpServletRequest request, HttpServletResponse response) {
// 1. 清除本地会话
request.getSession().invalidate();
// 2. 返回CAS登出URL(前端跳转)
return "redirect:https://cas.example.org/cas/logout?service=https://your-app.com/logged-out";
}
总结调用流程
- 前端触发 :用户点击退出按钮 → 跳转到
https://cas.example.org/cas/logout?service=...。 - CAS 处理:清除 CAS 会话 → 通知所有客户端(通过重定向或 Back-Channel)。
- 客户端处理 :在
service回调页面或接口中清除本地会话。
实现全局同步登出