【发布时间】:2020-09-07 21:40:18
【问题描述】:
我有一个 Angular Web 应用程序,我在根地址的域/IP 中提供服务。我使用 keycloak 和 gatekeeper 进行身份验证。会话在客户端作为 cookie 维护。我有一个静态 html 页面,在一个唯一的地址中提供,在我的网守中被列入白名单。当用户在我的 Angular 应用程序中按下 Logout 时,我将我的 web 应用程序重定向到此页面。
加载此页面将清除 keycloak 中的会话,并显示 You are logged out! 类型的消息。除了静态 html 正文之外,它还设置了以下响应标头
"Cache-Control": "no-cache, no-store, must-revalidate"
"Pragma": "no-cache"
"Expires": "0"
"Clear-Site-Data": "*"
"Set-Cookie": "kc-access=; Path=/; ..."
"Set-Cookie": "kc-state=; Path=/; ..."
所有这些都可以正常工作。当用户注销时,客户端的 cookie 会被清除。然而,现在当用户编辑地址栏时,而不是https://myip/logged_out_page 类型https://myip,角度应用程序从磁盘缓存中加载。
会话令牌全部无效,因此网络操作失败,因此没有数据丢失。但这是一个极端的可用性烦恼。
在关闭并重新打开浏览器窗口之前,不会清除文件的缓存。即使我关闭浏览器选项卡并重新打开相同的地址(域/IP),也会加载磁盘缓存。只有当我关闭浏览器窗口并重新打开缓存时才会跳过。
我能想到的一个解决方法是,在 Angular 应用主页本身中设置 Cache-Control: "no-cache" 标头,但我不希望这样。我希望 Angular 应用程序尽可能多地使用缓存。我只希望在加载 logged-out 页面时清除所有缓存(就像清除 cookie 一样)。
我设置的响应标头和清除 cookie 的图像:
清除标题:
清除 cookie:
我知道Clear-Site-Data 可能无法在非https 网站中使用,但为什么Cache-Control 也无法在此处使用?加载我的注销页面时,有什么方法可以禁用客户端缓存。我希望在我的注销页面加载时,即使使用非 https,也能关闭该域(所有子域)的所有浏览器缓存。
【问题讨论】:
标签: html http caching cookies keycloak