使用SessionExpireFilterAttribute捕获会话超时时,如何防止重定向循环?

时间:2015-03-16 15:29:40

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

同样,我是MVC的新手,所以请放轻松我。我需要在会话到期时将用户重定向到登录页面。我找到了一种方法来重载SessionExpireFilterAttribute类,但我的网站被重定向循环捕获。我对MVC知之甚少,无法弄清楚发生了什么。有人可以解释如何阻止重定向循环吗?

我用作模板的主要页面是http://www.codeblockdrive.com/2012/12/mvc-custom-filters-session-timeout.html,但我还搜索了stackoverflow并查看了多个页面,包括 MVC Session timeout issueASP.NET MVC Session.IsNewSession issue with Google ChromeRedirecting to specified controller and action in asp.net mvc action filter

这个页面Error: "This webpage has a redirect loop" in asp.net mvc似乎最接近我的问题,但我尝试了那里提到的解决方案(将SessionExpireFilter移动到一个单独的控制器),但它并没有帮助我。

以下是捕获会话超时的代码。它位于文件夹App_Start:

中名为FilterConfig.cs的文件中
 public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new SessionExpireFilterAttribute());
    }
}

public class SessionExpireFilterAttribute : ActionFilterAttribute
{
    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 && sessionCookie != "reset"))
                {
                    ctx.Response.Redirect("~/Admin/Login");
                }
            }
            base.OnActionExecuting(filterContext);
        }
    }
}

然后我将这段代码放在一个名为ErrorController.cs的控制器中。我也在AdminController.cs中尝试了这个,但我把它移到了一个单独的控制器而不是Login方法。

public class ErrorController : Controller
{
    [SessionExpireFilter]
    public ActionResult Index2()
    {
        // This method will not execute if our session has expired

        // render Home Page
        return View();
    }
}

然后这是登录方法。它位于AdminController.cs中。当它到达"返回视图"部分,它转到SessionExpireFilterAttribute。

public ActionResult Login()
    {
        if (Session["AdminUserName"] != null)
        {
            return RedirectToAction("Index");
        }

        ModelAdminLogin obj_MAL = new ModelAdminLogin();

        Session["Captcha"] = ClientUtility.GenerateRandomCode();

        Session["ErrMsg"] = null;

        if ((Request.Cookies["ADMINUSERNAME"] != null) && (Request.Cookies["ADMINPASSWORD"] != null))
        {
            obj_MAL.UserName = ClientUtility.DecryptString(Request.Cookies["ADMINUSERNAME"].Value);
            obj_MAL.Password = ClientUtility.DecryptString(Request.Cookies["ADMINPASSWORD"].Value);
            obj_MAL.RememberMe = true;

            return View(obj_MAL);
        }
        else
        {
            return View(obj_MAL);
        }
    }

总而言之,当会话超时时,站点会调用SessionExpireFilterAttribute.OnActionExecuting(根据需要)重定向到视图Admin / Login(根据需要),但在页面出现给用户之前,它会调用SessionExpireFilterAttribute.OnActionExecuting它再次启动循环。最后,我收到错误消息"此网页有一个重定向循环。"我需要一种方法在会话结束时重定向到登录页面,并且一旦它到达登录页面就不会返回到SessionExpireFilterAttribute类。

我会感激任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

我怀疑你在登录操作上也存在属性,这导致循环。在登录操作中使用AllowAnonymous属性:

 [AllowAnonymous]
 public ActionResult Login()
{

}