2016-01-13 1 views
0

У меня есть веб-приложение, которое сильно основано на ajax. У меня есть только один вид, который является логином и основным видом, а остальные - PartialView, которые будут вызваны с помощью ajax-запросов.Перенаправить пользователей обратно на логин, если сеанс истек на одностраничном приложении

Если я поставил сессионные шашки внутри partialviews (через ActionFilters), он вернет вид входа в систему, и он будет отображаться после моего успеха ajax, который не является моим желаемым результатом, так как я хочу, чтобы главная страница была перенаправлена вернуться к экрану входа в систему.

Одно решение, которое я думаю, использует тайм-аут javascript, который будет проверять, существует ли еще сеанс/аутентификация, учитывая набор интервалов, но я не знаю, хороша ли эта практика.

Может кто-нибудь предложить мне, что делать?

У меня есть 2 вида, которые являются login и mainframe, а затем около 30 PartialViews.

ответ

1

В прошлом я использовал таймер Javascript, чтобы опросить сервер, чтобы проверить, продолжает ли сеанс. Если я получаю 403, то перенаправление на страницу входа.

var AutoLogout = {}; 
AutoLogout.pollInterval = 60000; // Default is 1 minute. 

// Force auto logout when session expires 
AutoLogout.start = function (heartBeatUrl, sessionExpiredUrl, interval) { 
    if (interval) AutoLogout.pollInterval = interval; 

    var timer = $.timer(function() { 
     checkSession(heartBeatUrl, sessionExpiredUrl, timer); 
    }); 

    timer.set({ time: AutoLogout.pollInterval, autostart: true }); 
}; 

// Check the session serverside to see if we need to auto-logout 
// if the clientActivity flag is set then the session will be extended before checking. 
// if the session is still alive then set the next timer interval to be the time returned from the server. 
function checkSession(sessionUrl, sessionExpiredUrl, timer) { 
    $.ajax(sessionUrl, 
     { type: "post", 
      contentType: "application/json", 
      success: function (result) 
      { 
       // update the timer poll interval based on return value. 
       try { 
         var r = ko.toJS(result); 
         timer.set({ 
          time: r.TimeoutMilliseconds ? r.TimeoutMilliseconds : AutoLogout.pollInterval, autostart: true 
         }); 
       } 
       catch(e) { } 
      }, 
      error: function(e) 
      { 
       // do nothing 
      }, 
      statusCode: 
      { 
       403: function() 
       { 
        window.location.href = sessionExpiredUrl; 
       }, 
       401: function() 
       { 
        window.location.href = sessionExpiredUrl; 
       } 
      } 
     }); 
    } 

Затем, когда вы загружаете страницы, вызывайте AutoLogout.start с необходимым URL-адресом для вашего приложения.

Примечание: я использовал Knockout JS в этом примере для анализа данных, возвращаемых с помощью запроса сервера, но это зависит от вас.

+0

я вижу, плохо попробовать попытаться использовать та же логика. –

0

Постараюсь решить вашу проблему

Я предлагаю поставить свою логику в фильтре действия

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); 
     } 
    } 

также можно найти в этом Redirect From Action Filter Attribute

+0

У вас уже есть эта проблема, одна проблема в том, что это перенаправит дочерние представления, но не основной. Это означает, что вместо этого я получаю другой результат ajax. –

+0

okk, позвольте мне что-то придумать @Mr. Логика Беллиса также хороша –

Смежные вопросы