Angular.js登出时如何清除模板缓存

9

如何在用户点击注销后删除Angular模板缓存?我们进行了彻底的研究,并尝试实现了大多数可用的解决方案。我们尝试了以下方法:

HTML元标签

<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

服务器端

res.setHeader('cache-control', 'no-cache', 'no-store', 'must-revalidate');

Javascript

我们尝试按照这篇博客上的指示来删除浏览器历史记录。

我们现在面临的问题是,当用户从我们的应用程序注销并按下后退按钮时,他将看到空的HTML模板,因为服务没有被缓存,我们应该如何确保模板也不被缓存呢?


1
仅供参考:建议管理后退按钮以将用户重定向到登录页面,而不是删除模板缓存。 - harishr
问题是我们的登录页面没有使用AngularJS制作。我们有一个通用的登录页面适用于多个应用程序。 - Kuldeep Daftary
如果这是在服务器端处理的话,那么做起来会更容易。 - harishr
1
@entre 你建议的方法很好,我们通过将用户重定向到登录页面解决了这个问题。谢谢。 - Kuldeep Daftary
太好了,很高兴能帮上忙...我会把它作为答案 :) - harishr
显示剩余2条评论
2个回答

14

$templateCache只是围绕着具有特定名称的$cacheFactory的包装器。这实际上就是它的全部代码:

function $TemplateCacheProvider() {
  this.$get = ['$cacheFactory', function($cacheFactory) {
    return $cacheFactory('templates');
  }];
}

$cacheFactory具有removeAll()方法。如果您想自己连接它(例如,在注入了$cacheFactory的服务中),请尝试此操作:

$cacheFactory('templates').removeAll();

但是,如果您的应用程序具有安全敏感性,也许您想要完全禁用缓存。您可以对整个浏览器进行reload()调用以删除所有本地JS变量,然后在实际的HTTP驱动资产上使用上面的no-cache pragma,这样可以达到您想要的效果。


7
IMO $templateCache.removeAll() 看起来更加清晰易懂。 - Yuriy Rozhovetskiy
4
使用$templateCache.removeAll()时要小心。这实际上会删除所有内容,包括第三方库(如bootstrap-ui)使用的模板。相反,我建议您使用$templateCache.remove('template.html')逐个删除模板。 - Marius Bughiu
$templateCache.removeAll() 会破坏 angularjs-toaster。 - Soichi Hayashi

0

我找到了一个解决方案来解决我的问题,使用php,这里是如何使用php清除浏览器缓存?

我认为你可以使用以下标头将http请求设置为php文件: header("Cache-Control: no-cache, must-revalidate"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

在我的情况下,我的所有应用程序都在Angularjs上,但我使用php连接到api,所以在那个php中我放置了标头,它起作用了!

希望能帮到你!

编辑: 我的问题出现在移动浏览器(WindowsPhone10的IE Edge),使用此解决方案后没有更多问题。


1
请将以下与编程有关的内容从英语翻译成中文。只返回翻译后的文本:答案应始终使用问题中使用的相同语言。 - ArthurG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接