注销后,当在 mvc 3 asp.net 单击后退按钮时,页面仍显示

本文关键字:按钮 显示 net mvc 当在 asp 注销 单击 | 更新日期: 2023-09-27 17:56:09

我见过很多与此几乎相似的问题。但是,我还没有找到可以解决我问题的答案。

有一个注销按钮,我使用 Session.Abandon() 和 Session.Clear() 来清除会话。它工作正常。但是,每当我在浏览器上点击后退按钮时,页面仍然显示。但是,它应该显示登录表单,因为用户已经注销。

控制器:

[HttpPost]
public ActionResult LogOut()
{
     Session.Clear();
     Session.Abandon();
     return RedirectToAction("Index", "LogIn");
}

如何解决这个问题?.任何建议都非常感谢。提前谢谢。

注销后,当在 mvc 3 asp.net 单击后退按钮时,页面仍显示

您可以在global.asax中设置 NoCache

protected void Application_BeginRequest()
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
    Response.Cache.SetNoStore();
}

您可以将其设置为"ServerAndNoCache"以强制浏览器不缓存页面,而是服务器缓存页面,因此服务器上没有额外的负载。

还有另一个线程,我得到了答案防止在 MVC 中使用属性 ASP.NET 特定操作进行缓存

我的解决方案(.Net 6 MVC)如下:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
namespace YourSolutionName.Web.Mvc.Controllers.Attributes
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public sealed class NoCacheAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.GetTypedHeaders().CacheControl =
                    new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
                    {
                        NoStore = true,
                        NoCache = true,
                    };
            base.OnResultExecuting(filterContext);
        }
    }
}

然后将 [NoCache] 添加到我想要的控制器中。

我选择这个是因为它提供了对我想禁用缓存的位置的更精细的控制,但如果您想为整个解决方案执行此操作,它必须使用中间件完成(在启动时.cs)https://learn.microsoft.com/en-us/aspnet/core/performance/caching/middleware?view=aspnetcore-7.0

            app.UseResponseCaching();
            app.Use(async (context, next) =>
            {
                context.Response.GetTypedHeaders().CacheControl =
                    new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
                    {
                        NoStore = true,
                        NoCache = true,
                    };
                await next();
            });