在MVC中,我为会话超时创建了自定义属性,例如:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class SessionExpireFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
// If the browser session or authentication session has expired...
if (ctx.Session["USER_ID"] == null )
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{ "Controller", "Employer" },
{ "Action", "SessionTimeout" }
});
}
base.OnActionExecuting(filterContext);
}
}
我的意思是,当会话超时时,它应该重定向到“ SessionTimeout” Action方法,并且我为Controller方法放置了类似的代码,
[SessionExpireFilter]
public class EmployerController : Controller
{
//Action Methods
}
但是在这里,当Session为Timeout时,它将在浏览器地址上执行操作方法,但显示如下:
This webpage has a redirect loop
我不知道我要去哪里错了?
最佳答案
您的SessionTimeout
动作导致OnActionExecuting
中的SessionExpireFilter
重新运行,这将导致无限循环。您可以:
将SessionTimeout
操作放在没有SessionExpireFilter
属性的自己的控制器中
将SessionExpireFilter
属性置于除SessionTimeout
之外的各个动作上,而不是控制器上
检查当前动作是否在您的SessionTimeout
代码中为OnActionExecuting
,并且不要执行重定向(这不是最好的主意,因为它的名称将来可能会更改并再次引起麻烦)。