在 ASP.NET MVC 中,我们在 iOS 上禁用前后缓存时遇到问题。出于安全原因,我们不希望我们网站中的任何页面都可以通过后退和前进按钮进行访问。我们尝试过设置:
[OutputCache(NoStore = true, Duration = 1)]
还有一堆其他的东西,但没有任何效果。我们甚至不能在 onunload 事件中做任何事情,因为 iOS 也忽略了它。有任何想法吗?
在 ASP.NET MVC 中,我们在 iOS 上禁用前后缓存时遇到问题。出于安全原因,我们不希望我们网站中的任何页面都可以通过后退和前进按钮进行访问。我们尝试过设置:
[OutputCache(NoStore = true, Duration = 1)]
还有一堆其他的东西,但没有任何效果。我们甚至不能在 onunload 事件中做任何事情,因为 iOS 也忽略了它。有任何想法吗?
我们最终解决这个问题的方法是在 Layout 视图中执行此操作:
<script type="text/javascript">
@Html.Raw("var freshPage = true;")
</script>
当它通过我们的 C# 代码运行时,它将一个 javascript 变量设置为 true,告诉我们页面是新鲜的并通过了我们的控制器代码。然后我们把它放在我们的全局 javascript 文件中,以便在页面被拉起时检查该变量:
window.addEventListener('popstate', function () {
// If fresh page is false that means it is a cached page, remove html and reload page.
if (!freshPage) {
$('html').remove();
window.location.reload();
} else {
freshPage = false;
}
});
这是我们可以发现的唯一事件,当从缓存加载页面时 iOS 会触发。即使用户通过检查该变量来使用后退和前进按钮,这也会迫使 iOS 始终运行我们的服务器端代码。如果它是第一个页面加载,它会看到新页面为真,然后将其翻转为假。然后,如果用户点击后退或前进并返回到此页面,此代码将运行,看到freshPage 为假,因为它没有通过我们的C# 代码运行,终止html,并强制重新加载页面。