在MVC应用程序中,我有一个jQuery ajax帖子到控制器中的方法:
function initFormForInsert(metodoLoadForm, nomeForm, divForm, widthForm, heightForm, metodoInsert) {
blockPage();
var request = $.ajax(
{
type: 'POST',
url: getRootURL() + metodoLoadForm
});
request.done(function (data) {
//alert(data);
LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert);
});
request.fail(function (jqXHR, textStatus) {
unblockPage();
showErrorDialog("Error", textStatus);
});
}
我可以以某种方式强制request.fail()吗?
因为我使用全局过滤器来授权我的控制器中的所有方法(下面的代码)
特别是当我收到这个Ajax帖子并且我的session变量为null时,我想抛出异常。
protected override bool AuthorizeCore(HttpContextBase httpContext) {
try {
UserToken cUt = httpContext.GetUser();
if (cUt == null) {
//session is null
return false;
}
string request = httpContext.Request.Path;
if (httpContext.Request.Path.LastOrDefault() == '/')
request = httpContext.Request.Path.Remove(httpContext.Request.Path.Length - 1);
if (cUt.DeniedActions.Contains(request.ToUpper())) {
//user is not authorized
return false;
}
return true;
} catch (Exception) {
return false;
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
UserToken cUt = filterContext.HttpContext.GetUser();
if (cUt == null) {
//session is null
if (
//filterContext.HttpContext.Response.StatusCode == 302 &&
filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest"
) {
//filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 401;
} else {
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new {
controller = "Login",
action = "Login"
})
);
}
}
我已经通过这种方式修改了JavaScript对话框:
function initFormForInsert(metodoLoadForm, nomeForm, divForm, widthForm, heightForm, metodoInsert) {
blockPage();
var request = $.ajax(
{
type: 'POST',
url: getRootURL() + metodoLoadForm,
statusCode: {
200: function (data) {
//alert(200);
LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert);
},
401: function (jqXHR, textStatus, errorThrown) {
//alert(401);
hrefTo("/Login/Login") ;
}
}
});
//request.done(function (data) {
// //alert(data);
// LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert);
//});
request.fail(function (jqXHR, textStatus) {
unblockPage();
showErrorDialog("Errore inizializzando la form per inserimento ", textStatus);
});
}
并且授权如下:
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
try
{
UserToken cUt = httpContext.GetUser();
if (cUt == null)
//session is null
{
return false;
}
string request = httpContext.Request.Path;
if (httpContext.Request.Path.LastOrDefault() == '/')
request = httpContext.Request.Path.Remove(httpContext.Request.Path.Length - 1);
if (cUt.DeniedActions.Contains(request.ToUpper()))
{
//user is not authorized
return false;
}
return true;
}
catch (Exception)
{
return false;
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
UserToken cUt = filterContext.HttpContext.GetUser();
if (cUt == null)
{
// session is null
if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
filterContext.HttpContext.Response.End();
return;
}
else
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new
{
controller = "Login",
action = "Login"
})
);
}
}
}
你觉得还可以吗?
或者另一种方法,即使在if brench中可以添加较慢的方法
检查会话变量
blockPage();
if (checkSessionVariable()) {
hrefTo("/Login/Login");
}
else {
var request = $.ajax(
{
type: 'POST',
url: getRootURL() + metodoLoadForm,
});
request.done(function (data) {
//alert(data);
LoadFormForInsert(data, nomeForm, divForm, widthForm, heightForm, metodoInsert);
});
request.fail(function (jqXHR, textStatus) {
unblockPage();
showErrorDialog("Errore inizializzando la form per inserimento ", textStatus);
});
}
其中check session变量是检查会话变量的另一个帖子
function checkSessionVariable() {
var request = $.ajax(
{
type: 'POST',
url: getRootURL() + "/Login/SessionExpired"
});
request.done(function (data) {
return (data);
});
request.fail(function (jqXHR, textStatus) {
return 0;
});
}
也许这是一个更可靠的解决方案?