AngularJSとASP.NET MVCログインタイムアウトソリューション
6083 ワード
質問:
1.ActionでAjax要求を判断する方法Request.IsajaxRequest()は常にfalse
2.フロントのStatusCodeとHttpUnauthorizedResultに戻ります.フロントが受信したStatusは200で、成功を示します.
ソリューション:
1.いくつかの資料を調べたところ、バックグラウンドでAjaxリクエストがリクエストデータheadersのX-Requested-Withに基づいて認識されているかどうかを判断し、現在のAngularJS$httpサービスリクエストを使用すると自動的に加算されるはずだと判断した(jQueryを使用することにも問題があると反応する人も多いので、私は試していませんが、通病かどうか分かりません).そこで何とかしてAngularJSのすべてのAjaxリクエストの前にX-Requested-Withを加え、ここでは$httpProviderを使用します.interceptorsブロック方式で統一処理を行う.
2.私がバックグラウンドで使用しているのはActionFilter方式の統一処理でログインを検証し、HttpUnauthorizedResultに戻る必要がありますが、フロントで受信したstatusは常に200です.ここで注意する必要がある点:a)ResponseのStatusステータスコードを手動で設定する必要がある;b)設定完了後にResponseを実行する必要がある.End()
フロント要求、応答ブロックコード:
1.ActionでAjax要求を判断する方法Request.IsajaxRequest()は常にfalse
2.フロントのStatusCodeとHttpUnauthorizedResultに戻ります.フロントが受信したStatusは200で、成功を示します.
ソリューション:
1.いくつかの資料を調べたところ、バックグラウンドでAjaxリクエストがリクエストデータheadersのX-Requested-Withに基づいて認識されているかどうかを判断し、現在のAngularJS$httpサービスリクエストを使用すると自動的に加算されるはずだと判断した(jQueryを使用することにも問題があると反応する人も多いので、私は試していませんが、通病かどうか分かりません).そこで何とかしてAngularJSのすべてのAjaxリクエストの前にX-Requested-Withを加え、ここでは$httpProviderを使用します.interceptorsブロック方式で統一処理を行う.
2.私がバックグラウンドで使用しているのはActionFilter方式の統一処理でログインを検証し、HttpUnauthorizedResultに戻る必要がありますが、フロントで受信したstatusは常に200です.ここで注意する必要がある点:a)ResponseのStatusステータスコードを手動で設定する必要がある;b)設定完了後にResponseを実行する必要がある.End()
フロント要求、応答ブロックコード:
zmApp.config(function ($httpProvider) {
$httpProvider.interceptors.push(['$rootScope', '$q', '$location', '$timeout',
function ($rootScope, $q, $location, $timeout) {
return {
'request': function (config) {
// AJAX ( IsAjaxRequest() false)
config.headers['X-Requested-With'] = 'XMLHttpRequest';
return config || $q.when(config);
},
'requestError': function (rejection) {
return rejection;
},
'response': function (response) {
return response || $q.when(response);
},
'responseError': function (response) {
console.log('responseError:' + response);
if (response.status === 401 || response.status === 403) {
abp.notify.error(" , !");
$timeout(function () { window.location = "/Login"; }, 3000);
return false;
}
else if (response.status === 500) {
$location.path('/error');
return false;
}
return $q.reject(response);
}
};
}]);
});
バックグラウンドActionFilterコード:public class LoginAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContextBase context = filterContext.HttpContext;
HttpResponseBase response = filterContext.HttpContext.Response;
HttpRequestBase request = filterContext.HttpContext.Request;
if (context.Session["User"] == null)
{
if (request.IsAjaxRequest())
response.Status = "401 Session Timeout";
else
response.Redirect("/Login");
filterContext.Result = new HttpUnauthorizedResult();// Action
response.End();// , status 200
return;
}
base.OnActionExecuting(filterContext);
}
}