会话到期后重定向到特定页面(MVC4)

时间:2014-08-21 10:01:27

标签: asp.net-mvc-4 session session-timeout

C#MVC4项目:我想在会话到期时重定向到特定页面。

经过一些研究,我将以下代码添加到我项目中的Global.asax

protected void Session_End(object sender, EventArgs e)
{
     Response.Redirect("Home/Index");
}

当会话过期时,会在Response.Redirect("Home/Index");The response is not available in this context处抛出异常,说{{1}}

这里有什么问题?

3 个答案:

答案 0 :(得分:25)

MVC中最简单的方法就是这样 如果会话过期,您必须在每个操作中检查其会话,如果它是null,则重定向到索引页面。

为此,您可以创建自定义属性,如下所示: -

这是覆盖ActionFilterAttribute的类。

public class SessionExpireAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;
            // check  sessions here
            if( HttpContext.Current.Session["username"] == null ) 
            {
               filterContext.Result = new RedirectResult("~/Home/Index");
               return;
            }
            base.OnActionExecuting(filterContext);
        }
    }

然后在操作中添加此属性,如下所示:

[SessionExpire]
public ActionResult Index()
{
     return Index();
}

或者只需将属性添加一次:

[SessionExpire]
public class HomeController : Controller
{
  public ActionResult Index()
  {
     return Index();
  }
}

答案 1 :(得分:0)

这是MVC中的一些新功能。



    Public class SessionAuthorizeAttribute : AuthorizeAttribute
    {
        Protected override void HandleUnauthorizeRequest( 
                                   AuthorizationContext filtercontext )
            { 
                filtercontext.Result = new RedirectResult("~/Login/Index");
            } 
    }


在控制器上将此过滤器应用于要应用授权的过滤器。



    [SessionAuthorize]
    public class HomeController : Controller
    {
        // Something awesome here.
    }


以上SessionAuthorizeAttribute的HandleUnAuthorizeRequest函数只会在授权失败后调用,而不是反复检查授权。

此致 MK

答案 2 :(得分:0)

创建此动作过滤器类

    class SessionExpireAttribute : ActionFilterAttribute {
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.HttpContext.Session["logged"] == null)
        {
            filterContext.Result = new RedirectResult("/Account/Login");
        }
        base.OnActionExecuted(filterContext);
    }

然后在下面的类或方法中使用它

[SessionExpireAttribute]
public class MyController : Controller
{
    ....
}