Tutti, sto tentando di reindirizzare alla pagina di accesso se si effettua una chiamata ajax durante il timeout della sessione. Ecco cosa ho fatto finora.Chiamata di Ajax in caso di timeout di sessione
Definire un filtro di azione per tutte le azioni.
public class AuthenticateFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var routeDataSet = filterContext.RouteData;
if (LoginUser.LoginAdministrator == null)
{
//if the useinfo stored in session is timeout.
if (routeDataSet != null
&& routeDataSet.Values["controller"] != null
&& routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
&& routeDataSet.Values["action"] != null
&& routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
{
//if it is login action itself.let it be. don't do anything.
}
else
{
//redirect to login page.
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
}
}
}
}
Questo funziona per chiamata azione non ajax quando il timeout di sessione. Ma per la chiamata ajax. Non può reindirizzare alla pagina di login, ma restituire solo una stringa di pagina html (sembra essere il codice html di origine per la pagina di accesso), non il risultato reale. Diciamo che abbiamo un codice come questo.
function ajaxGetLogDetail(logId) {
var sUrl = "/LogDetail/index?logId=" + logId;
$.ajax({
cache: false,
type: "GET",
async: false,
url: sUrl,
success: function (result) {
//please note result is html string. not the really result.
},
error: function (xhr) {
alert(xhr.responseText);
}
});
}
Qualcuno potrebbe aiutarmi a darmi qualche indizio per risolvere questo problema? Grazie.
Aggiornato
in base alla risposta del Mohsin e Dave (grazie voi due), Ecco la finalmente soluzione. Si prega di rivederlo. Grazie.
public class AuthenticateFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var routeDataSet = filterContext.RouteData;
if (LoginUser.LoginAdministrator == null)
{
//&& routeDataSet != null && routeDataSet.Values["controller"] != null
//&& !routeDataSet.Values["controller"].ToString().ToLower().Equals("login") && routeDataSet.Values["action"] != null
//&& !routeDataSet.Values["action"].ToString().ToLower().Equals("login") && !filterContext.HttpContext.Request.HttpMethod.ToLower().Equals("get"))
if (routeDataSet != null
&& routeDataSet.Values["controller"] != null
&& routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
&& routeDataSet.Values["action"] != null
&& routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
{
}
else
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult
{
Data = new
{
ErrorMessage = "SystemSessionTimeOut"
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
}
}
}
}
}
Sul lato client:
function ajaxGetLogDetail(logId) {
var sUrl = "/LogDetail/index?logId=" + logId;
$.ajax({
cache: false,
type: "GET",
async: false,
url: sUrl,
success: function (result) {
if (result.ErrorMessage=="SystemSessionTimeOut")
{
windows.location="/Login/Login";
}
else
{
//...
}
},
error: function (xhr) {
alert(xhr.responseText);
}
});
}
puoi verificare il tipo di richiesta utilizzando IsAjaxRequest nella tua vista dopo essere stato reindirizzato dal filtro precedente e rispondere di conseguenza –
Buona idea, intendevi il 'f ilterContext.HttpContext.Request.IsAjaxRequest'? Grazie. –
Ciao, Mohsin, Dave mi ha dato maggiori dettagli. Quindi, l'unico modo per farlo è eseguire un reindirizzamento lato client. Penso che sia la parte del tuo significato. –