Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果MVC中的会话不可用,如何重定向到登录页面_C#_Asp.net_.net_Asp.net Mvc - Fatal编程技术网

C# 如果MVC中的会话不可用,如何重定向到登录页面

C# 如果MVC中的会话不可用,如何重定向到登录页面,c#,asp.net,.net,asp.net-mvc,C#,Asp.net,.net,Asp.net Mvc,我正在开发ASP.NETMVC5.0应用程序。现在我已经创建了登录页面。当用户有效时,我将用户详细信息存储到seesion中 if(_loginmodel.authstatus == false) { return View("Index"); } Session["authstatus"] = true; Session["userid"] = _loginmodel.userid;

我正在开发ASP.NETMVC5.0应用程序。现在我已经创建了登录页面。当用户有效时,我将用户详细信息存储到seesion中

        if(_loginmodel.authstatus == false)
        {
            return View("Index");
        }

        Session["authstatus"] = true;
        Session["userid"] = _loginmodel.userid;
        Session["useremail"] = _loginmodel.useremail;
        Session["username"] = _loginmodel.username;
否当用户转到其他文件时,我再次检查会话是否可用

  public class CityController : Controller
    {

    private CityModels _citymodel;

    #region Constructor
    public CityController()
    {
        if (Session != null && Session["authstatus"] != null)
        {
            _citymodel = new CityModels();

        }
        RedirectToAction("Index", "Login");
    }
    #endregion
   }

那么现在,如果会话过期,我如何将他重定向到登录页面呢?我想您可以将此逻辑封装在操作筛选器中,并在其中重定向:

    public class AuthorizeActionFilterAttribute : ActionFilterAttribute
    {
      public override void OnActionExecuting(FilterExecutingContext filterContext)
      {
        HttpSessionStateBase session = filterContext.HttpContext.Session;
        Controller controller = filterContext.Controller as Controller;

        if (controller != null)
        {
          if (session != null && session ["authstatus"] == null)
          {
filterContext.Result =
       new RedirectToRouteResult(
           new RouteValueDictionary{{ "controller", "Login" },
                                          { "action", "Index" }

                                         });
          }
        }

        base.OnActionExecuting(filterContext);
      }
    }
详情请参阅:


您应该创建一个自定义筛选器属性来处理会话到期,如下所示-

public class SessionExpireFilterAttribute : ActionFilterAttribute
{
    /// <summary>
    /// Custom attribute for handling session timeout
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext ctx = HttpContext.Current;

        // check if session is supported
        if (ctx.Session != null)
        {
            // check if a new session id was generated
            if (ctx.Session.IsNewSession)
            {
                // If it says it is a new session, but an existing cookie exists, then it must
                // have timed out
                string sessionCookie = ctx.Request.Headers["Cookie"];
                if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    ctx.Response.Redirect("~/Error/SessionTimeoutVeiw");
                }
            }
        }
        base.OnActionExecuting(filterContext);
    }
}
公共类SessionExpireFilterAttribute:ActionFilterAttribute
{
/// 
///用于处理会话超时的自定义属性
/// 
/// 
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx=HttpContext.Current;
//检查是否支持会话
如果(ctx.Session!=null)
{
//检查是否生成了新的会话id
if(ctx.Session.IsNewSession)
{
//如果它说这是一个新会话,但存在一个现有cookie,那么它必须
//超时
字符串sessioncokie=ctx.Request.Headers[“Cookie”];
if((null!=sessionokie)和&(sessionokie.IndexOf(“ASP.NET_SessionId”)>=0))
{
重定向(“~/Error/sessiontimeoutvew”);
}
}
}
base.OnActionExecuting(filterContext);
}
}
现在要使用此自定义属性,请使用此属性装饰控制器方法或类

[SessionExpireFilterAttribute]

如果您需要将此筛选器应用于所有控制器,则可以在FilterConfig文件中注册此筛选器

因此,当会话到期时,会话中的值也一样,您不需要检查特定会话值是否已过期

  • 在web.config文件中编写代码,将会话超时设置为2分钟

    
    
  • 在layout.cshtml中的
    标记中编写下面的代码

    //session end 
    var sessionTimeoutWarning = @Session.Timeout - 1;
    var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000;
    setTimeout('SessionEnd()', sTimeout);
    
    function SessionEnd() {
        window.location.hostname = "";
        /* $(window.Location).attr("href", "@Url.Content("~/Login/index/")"); */
        window.location = "/Login/index/";
    }
    
  • 在control and action中编写下面的代码

    [HttpGet]
    public ActionResult Logout()
    { 
        Session["id1"] = null;
        Session["id2"] = null;
        Session["id3"] = null;
        Session["id4"] = null;
        Session["Region"] = null;
        Session.Clear();           
        Session.RemoveAll();
        Session.Abandon();
        Response.AddHeader("Cache-control", "no-store, must-revalidate, private, no-cache");
        Response.AddHeader("Pragma", "no-cache");
        Response.AddHeader("Expires", "0");
        Response.AppendToLog("window.location.reload();");
    
        return RedirectToAction("Index", "Login");
    }
    

  • 您可以将用户重定向到全局会话中会话启动事件的登录页面

    protected void Session_Start()
            {            
                if (Session["Username"] != null)
                {
                    //Redirect to Welcome Page if Session is not null  
                    HttpContext.Current.Response.Redirect("~/WelcomeScreen", false);
    
                }
                else
                {
                    //Redirect to Login Page if Session is null & Expires                   
                    new RedirectToRouteResult(new RouteValueDictionary { { "action", "Index" }, { "controller", "Login" } });
                }
            }
    

    在构造函数中不能这样做。使用操作筛选器。@David:不。该方法没有副作用。不,RedirectToAction()不起作用。。如何使用动作过滤器#Slaksu请给我举个例子或建议我在哪里检查会话不适合我。我通过AJAX使用partialview加载页面,但这种方法不起作用(会话过期时,代码不会在这里出现):(有什么想法吗?我还会在文档模型的ajaxStart或ajaxStop事件中执行clearTimeout并重置mvc应用程序中每个AJAX调用的时钟。