2016-12-30 102 views
1

所有我已经看类似的解决方案为以下物质的第一:重定向到登录页面后会话超时

ASP.NET MVC : Handle Session Expire Using Custom Attribute

Redirect to specific page after session expires (MVC4)

但我需要更多关于这一个聪明的解决方案只需在Global.asax上键入一个代码就可以解决问题,而且不需要每个控制器都有额外的实现。可能吗?如果不是,ASP.NET MVC中会话超时后重定向到登录页面的最佳方法是什么?

+0

我建议你使用自定义属性。 –

+0

@AkınAbdullahoğlu为什么不发布您以前使用过的任何示例? –

+0

我的想法是不使用Global.asax中,这个例子会给出一个想法https://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-custom-action -filters –

回答

0

您可以从Session_End方法处理会话超时的Global.asax。 仅供参考,它有一些缺点:在超时之后它不会被调用,它会在您的会话处于运行时内存时起作用。试试看,也许这对你的情况已经足够了。

另一种方法可以使用SessionStateModule或创建自定义HTTP module配对一些global events可用于会话控制。

+0

你能否请一个示例说明如何将它们集成到现有的ASP.MVC项目中? –

+0

对于第一种情况只是复制逻辑从您提到的SO答案,对于第二种情况,您可以检查user1429080的答案,因为他使用的是全局事件(当请求状态(例如会话状态)为与当前请求相关的已获得) – ivamax9

+0

没有为我工作。我通过AJAX使用partialview加载页面,并且这种方法不起作用(当会话过期时,代码不会碰到这里):(任何想法? –

0

用新设置MVC应用程序测试此。它背后的想法是检查每个传入请求的会话状态,对我来说似乎正常工作。

void Application_PostAcquireRequestState(object sender, EventArgs e) 
{ 
    HttpContext context = ((HttpApplication)sender).Context; 
    if (context.Session != null) 
    { 
     if (context.Session["sessionExist"] is bool && (bool)context.Session["sessionExist"]) 
      return; 
    } 

    // put code here that you want to execute if the session has expired 
    // for example: 

    FormsAuthentication.SignOut(); 

    // or maybe 

    context.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
} 

然后在Global.asax中添加Session["sessionExist"] = true;后,用户成功登录。

+0

不,它导致applicat6ion给出错误。我认为不适合ASP.NET MVC。 –

+0

@ClintEastwood尝试编辑后的版本没有显式重定向到登录页面。重定向可能会导致问题,如果它无法正确识别前面if语句中的登录页面,如果这仍然不适用于你,我将删除答案... – user1429080

+0

我认为这种方法没问题,但似乎有一点缺点。我使用AJAX打开页面(呈现partialview),并且此方法无法重定向到登录页面。如何解决它?没有必要删除你的答案,只需编辑它。谢谢... –

0

使用GlobalFilters

GlobalFilters.Filters.Add(new SessionExpireFilterAttribute()); 

借鉴最佳答案的评论由院长沃德 Redirect to specific page after session expires (MVC4)

+0

谢谢,它似乎是很好的解决方案,但不幸的是没有为我工作。我通过AJAX使用partialview加载页面,并且这种方法不起作用(在会话过期时代码没有打到这里):(任何想法? –

+0

然后你需要自己制作它,你需要在c#和当计时器点击在正确的时间杀死所有会话@ClintEastwood –

0

采取我经常看到这样的解决方案你的例子:http://www.c-sharpcorner.com/UploadFile/91c28d/handle-session-expire-using-custom-attribute-in-Asp-Net-mvc/

,然后才能创建BaseController.cs控制器和定义OnActionExecuting方法。

public class BaseController : Controller 
{ 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     base.OnActionExecuting(filterContext); 


     if (Session["UserLogin"] == null) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "ManageAccount" }, { "action", "Login" } }); 
     } 
    } 

} 

在下一步创建HomeController.cs继承BaseController.cs文件。

public class HomeController : BaseController 
{ 
    // GET: Home 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

BaseController OnActionExecuting方法处理每个请求,并检查会话控制。

[HttpPost] 
    public ActionResult LoggedIn() 
    { 
     Session["UserLogin"] = true; 

     return RedirectToAction("Index", "Home"); 
    } 

创建示例登录POST方法,发送请求集用户登陆会话参数并重定向到首页/索引页。每个你继承通话将执行每个请求的会话控制的控制器。

我希望它有帮助。

+0

没有为我工作我使用partialview通过AJAX加载页面,并且这种方法不起作用(代码没有打到这里时,会话过期):(任何理念? –

相关问题