Tất cả, tôi đang cố chuyển hướng đến trang đăng nhập nếu thực hiện cuộc gọi ajax khi hết giờ phiên. Đây là những gì tôi đã làm cho đến nay.Cuộc gọi Ajax khi hết giờ
Xác định bộ lọc hành động cho tất cả tác vụ.
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" } });
}
}
}
}
Thao tác này không hoạt động khi hết thời gian phiên. Nhưng đối với cuộc gọi ajax. Nó không thể chuyển hướng đến trang đăng nhập nhưng chỉ trả lại một chuỗi trang html (có vẻ như nó là mã nguồn html cho trang đăng nhập), không phải là kết quả thực sự. Giả sử chúng ta có mã như thế này.
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);
}
});
}
Có ai giúp tôi một số đầu mối để giải quyết vấn đề này không? cảm ơn.
Cập nhật
Dựa trên của Mohsin và Dave câu trả lời (nhờ bạn hai), đây là cuối cùng giải pháp. Xin vui lòng xem lại nó. cảm ơn.
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" } });
}
}
}
}
}
Về phía khách hàng:
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);
}
});
}
bạn có thể kiểm tra loại yêu cầu bằng cách sử dụng IsAjaxRequest trong chế độ xem của bạn sau khi được chuyển hướng từ bộ lọc ở trên và trả lời tương ứng –
Ý tưởng hay, Ý của bạn là 'f ilterContext.HttpContext.Request.IsAjaxRequest'? cảm ơn. –
Xin chào, Mohsin, Dave đã cho tôi biết thêm chi tiết. Vì vậy, cách duy nhất để làm cho nó là thực hiện một chuyển hướng phía khách hàng. Tôi nghĩ rằng đó là một phần của ý nghĩa của bạn. –