我正在使用ASP.NET MVC(最新版本)。
想象一下有两页:
第1页:“输入数据”>>第2页:“谢谢”
提交Page-1后,您将被重定向到Page-2。
我的目标:我想确保在您进入Page-2后点击浏览器的后退按钮时无法返回到Page-1。相反,我希望你留在Page-2(或者每次按下后退按钮时都被推到Page-2)。
我尝试过各种各样的事情。以下只是一些简化的伪代码......
[NoBrowserCache]
public ActionResult Page1(int userId)
{
var user = GetUserFromDb(userId);
if (user.HasAlreadySubmittedPage1InThePast)
{
// forward to page 2
return RedirectToAction("Page2", routeValues: new { userId = userId });
}
var model = new Page1Model();
return View("Page1", model);
}
[NoBrowserCache]
[HttpPost]
public ActionResult Page1(Page1Model model)
{
var user = GetUserFromDb(model.UserId);
if (user.HasAlreadySubmittedPage1InThePast)
{
// forward to page 2
return RedirectToAction("Page2", routeValues: new { userId = model.UserId });
}
// Save posted data to the db
// ...
return RedirectToAction("Page2", routeValues: new { userId = model.UserId });
}
public class NoBrowserCache : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Haha ... tried everything I found on the web here:
// Make sure the requested page is not put in the browser cache.
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-cache");
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.Now);
filterContext.HttpContext.Response.Expires = 0;
}
}
如果我每次点击后退按钮时只能确保将请求发送到服务器。但是现在,单击后退按钮只是从浏览器的缓存中拉出Page-1而不向服务器发送请求。所以目前,我没有机会通过服务器方式将你转发到Page-2。
有任何想法或建议吗?
谢谢,伙计们!
顺便说一句:没有涉及登录/身份验证。所以,我不能使用Session.Abandon()或类似的东西。如果可能的话,我宁愿使用一些基于服务器的代码而不是javascript。
编辑2017-5-12 在@ grek40之后,我确保反查询语句最终出现在浏览器中。我因此从上面的C#代码中完全删除了[NoBrowserCache] -ActionFilterAttribute。相反,我在< head>中添加了以下语句。我的_Layout.cshtml的一部分:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
我确认这三行正在呈现给我的浏览器(使用浏览器的开发人员工具进行检查)。但是,缓存仍然有效。我仍然可以在没有服务器请求的情况下向后移使用Google Chrome v62,Firefox Quantum v57和Microsoft Edge v41(全部在Win10上)进行了测试。 #
编辑2017-6-12 再次关注@ grek40的建议:尝试Expires:0以及Expires:-1。没有不同。我仍然无法管理,关闭浏览器的缓存。
答案 0 :(得分:4)
最后我找到了解决方案。这是基于javascript的,但非常简单。
我只需将以下代码段添加到我的Page-2页面(我不希望用户在他们到达后再离开的页面):
<script type="text/javascript">
$(document).ready(function () {
history.pushState({ page: 1 }, "title 1", "#nbb");
window.onhashchange = function (event) {
window.location.hash = "nbb";
};
});
我在这里找到了这个:how to stop browser back button using javascript
感谢所有支持人员。但是&#34;我自己的&#34;解决方案是唯一有效的解决方案。
答案 1 :(得分:1)
这可以通过使用javascript来完成。使用以下代码
<script type = "text/javascript" >
function preventBack(){window.history.forward();}
setTimeout("preventBack()", 0);
window.onunload=function(){null};
</script>
答案 2 :(得分:0)
您可以为客户端解决方案的每个页面添加一行javascript:
history.forward();
请参阅文档on MDN。当是要前进的页面时(使用时按下BACK按钮),这将强制用户访问该页面。当用户已经在最近的页面时,这不会做任何事情(没有错误)。
答案 3 :(得分:0)
Response.Cache.SetCacheability(HttpCacheability.NoCache); // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
答案 4 :(得分:0)
这段代码可以帮助您解决问题。
<script type="text/javascript">
/*To retain on the same view on Back Click*/
history.pushState(null, null, window.location.href);
window.addEventListener('popstate', function (event) {
history.pushState(null, null, window.location.href);
event.preventDefault();
});
</script>