我知道这是重复但我无法获得可靠的解决方案(对于asp.net web)。
如果会话过期,我只想重定向到登录页面。 我试过以下:
$.ajax({
type: "POST",
url: "stream.asmx/SomeMethod",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
//success msg
},
error: function (request, status, error) {
if (status = 403) {
location.href = 'login.aspx';
}
}
});
问题:这也会为其他错误返回相同的状态代码(403),我只期望会话超时。
if (!object.Equals(HttpContext.Current.Session["User"], null))
{
Id = int.Parse(HttpContext.Current.Session["User"].ToString());
}
else
{
result = from row in dtscrab.AsEnumerable()
select new
{
redirectUrl = "login.aspx",
isRedirect = true
};
}
关于$ .ajax成功:
success: function (msg) {
if (msg.d[0].isRedirect) {
window.location.href = msg.d[0].redirectUrl;
}
else {
//load containt
}
}
问题:如果会话过期,它会以某种方式调用ajax成功行(它确实会返回正确的json)。如果我在页面中有很多ajax请求(应该全局处理),即使这不是一个正确的方法。
但是,我看到这篇文章非常好,但是对于使用AuthorizeAttribute
的mvc来说:handling-session-timeout-in-ajax-calls
那么,我是否可以在asp.net web api中使用AuthorizeAttribute在mvc中使用相同的概念?如果没有,我如何解决我所面临的问题(上述两个中的任何一个)?
答案 0 :(得分:3)
403状态代码将导致jQuery调用失败方法。在第二次尝试时保留相同的代码,但将重定向处理程序移动到failure方法而不是success方法。在成功方法中,按照通常的方式对待它。
答案 1 :(得分:3)
我的Razor MVC应用程序遇到同样的问题,当会话超时时ajax调用时抛出异常。
我设法解决此问题的方法是通过使用简单的轻量级Action Action(RAZOR MVC)监视每个ajax请求,返回bool变量,无论Request是否经过身份验证。请在下面找到代码..
<script>
var AuthenticationUrl = '/Home/GetRequestAuthentication';
var RedirectUrl = '/Account/Logon';
function SetAuthenticationURL(url) {
AuthenticationUrl = url;
}
function RedirectToLoginPage() {
window.location = RedirectUrl;
}
$(document).ajaxStart(function () {
$.ajax({
url: AuthenticationUrl,
type: "GET",
success: function (result) {
if (result == false) {
alert("Your Session has expired.Please wait while redirecting you to login page.");
setTimeout('RedirectToLoginPage()', 1000);
}
},
error: function (data) { debugger; }
});
})
然后在Home Controller / Server端,您需要一个方法来验证请求并返回布尔变量..
public ActionResult GetAuthentication ( )
{
return Json(Request.IsAuthenticated, JsonRequestBehavior.AllowGet);
}
这将验证每个ajax请求,如果会话因任何ajax请求而过期,它将通过消息提醒用户并将用户重定向到登录页面。
我还建议不要使用标准警报提醒。用户一些工具提示格式化div警报。标准JS警报可能会强制用户在重定向之前单击“确定”。
希望它有所帮助.. :)
谢谢, Riyaz
答案 2 :(得分:3)
最后,我最终关注了。
public class IsAuthorizedAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
var sessions = filterContext.HttpContext.Session;
if (sessions["User"] != null)
{
return;
}
else
{
filterContext.Result = new JsonResult
{
Data = new
{
status = "401"
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
//xhr status code 401 to redirect
filterContext.HttpContext.Response.StatusCode = 401;
return;
}
}
var session = filterContext.HttpContext.Session;
if (session["User"] != null)
return;
//Redirect to login page.
var redirectTarget = new RouteValueDictionary { { "action", "LogOn" }, { "controller", "Account" } };
filterContext.Result = new RedirectToRouteResult(redirectTarget);
}
}
处理客户端
<script type="text/javascript">
$(document).ajaxComplete(
function (event, xhr, settings) {
if (xhr.status == 401) {
window.location.href = "/Account/LogOn";
}
});
</script>
答案 3 :(得分:1)
您可以将会话超时过期警告设置为......
<script type="text/javascript">
//get a hold of the timers
var iddleTimeoutWarning = null;
var iddleTimeout = null;
//this function will automatically be called by ASP.NET AJAX when page is loaded and partial postbacks complete
function pageLoad() {
//clear out any old timers from previous postbacks
if (iddleTimeoutWarning != null)
clearTimeout(iddleTimeoutWarning);
if (iddleTimeout != null)
clearTimeout(iddleTimeout);
//read time from web.config
var millisecTimeOutWarning = <%= int.Parse(System.Configuration.ConfigurationManager.AppSettings["SessionTimeoutWarning"]) * 60 * 1000 %>;
var millisecTimeOut = <%= int.Parse(System.Configuration.ConfigurationManager.AppSettings["SessionTimeout"]) * 60 * 1000 %>;
//set a timeout to display warning if user has been inactive
iddleTimeoutWarning = setTimeout("DisplayIddleWarning()", millisecTimeOutWarning);
iddleTimeout = setTimeout("TimeoutPage()", millisecTimeOut);
}
function DisplayIddleWarning() {
alert("Your session is about to expire due to inactivity.");
}
function TimeoutPage() {
//refresh page for this sample, we could redirect to another page that has code to clear out session variables
location.reload();
}
答案 4 :(得分:0)
4xx是HTTP错误状态代码,会导致jquery执行onFailure回调。
另外,当您想要处理有效负载时,请注意使用3xx进行重定向。根据我的经验,Internet Explorer只是在返回3xx状态代码时进行重定向(不查看有效负载)。
我会说,抛出403并处理这种情况。客户端403意味着禁止资源访问。可能有多种原因,我猜是可以的。