【问题标题】:Clearing client side cache via html headers通过 html 标头清除客户端缓存
【发布时间】: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


    【解决方案1】:

    我找到了问题的原因。我在 Angular 的 index.html 中设置的任何标题都无关紧要。 Angular 应用程序最终通过 nginx-ingress 提供服务,因为它部署在 kubernetes 中。所以,为了解决这个问题,我必须添加一个 nginx 标头来显式添加 Cache-Control 标头,这样就解决了问题。

    我需要的 nginx-ingress 注解如下:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/configuration-snippet: |
          more_set_headers "cache-control: no-store";
    

    我在logged-out 页面中设置的标题也无关紧要,因为它们仅适用于该页面,而不适用于 Angular 应用程序或域。

    【讨论】:

    • 嘿!很好的解决方案。不过,这会禁用所有网站的缓存,对吗?
    • 另外,“no-cache”选项不应该更好吗? (而不是无商店)
    • 说实话,我根本没有这方面的背景。对不起:(
    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多