菜鳥プログラマーのAsp.NetMVCセッション期限切れ異常の処理
7294 ワード
趙さんは卒業したばかりのコンピューター専攻の大学生で、4年間の大学の時間の中で、プログラミングのデータをたくさん読んで、コードもたくさん手に入れました.今卒業して、彼は願い通りT会社に入社して、自分のプログラマー生活を始めました.彼は自信満々で、自分の4年間の勉強したことを信じて、きっと仕事で役に立つことができて、自分のすぐに今の仕事に適任することを助けることができます.
目次を読む:
一、Sessionによる異常
二、MVCの中のFilterを使ってSessionを検証する
三、Ajax要求の中で、Sessionが失効する処理
四、Sessionの期限切れ異常の処理の重要性
一、Sessionによる異常
目次を読む:
一、Sessionによる異常
二、MVCの中のFilterを使ってSessionを検証する
三、Ajax要求の中で、Sessionが失効する処理
四、Sessionの期限切れ異常の処理の重要性
一、Sessionによる異常
趙さんは会社に入ったばかりで、実際のプロジェクトに参加しました.プロジェクトはAspを使っています.net MVC.約2週間かけて、趙さんはすべての機能を完成し、QAテストに提出しました.
ある日、QAはテストの結果を送って、趙さんは一度やって、自分が作ったものを発見して、中には問題がこんなに多いことに気づいた.
1つのバグは次のとおりです.
Firefoxを使用してシステムにログイン後、Tabを1つ開き、システムページに入り、logoutをクリックします.前のtabページに戻り、Saveボタンをクリックするとjsエラーが発生しました.この場合、ユーザーをログインページに移動する必要があります.
趙さんはこのバグを見て呆然としたが、QAがこのような「暴力」で自分のプログラムをテストするとは思わなかった.別のタブでlogoutをクリックすると、セッションが空になり、最初のタブのSaveボタンをクリックすると、呼び出されたAjaxメソッドに異常が発生します.
しかし、このような「非正常」操作による異常をどのように処理するのか.
二、MVCの中のFilterを使ってSessionを検証する
趙さんは資料を調べたところ、MVCのAuthorizationFilterが実際にControllerにアクセスする前に、リクエストをブロックできることが分かった.この時、ここでSessionの有効性をチェックすることができ、Sessionが失効したことを発見したら、ユーザーをログインページに移すことができる.(MVCフィルタについてはここ)[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
filterContext.Result = new RedirectResult(redirectUrl);
return;
}
}
}
三、Ajax要求の中で、Sessionが失効する処理
Ajaxリクエストでセッションが期限切れになった場合、上記の方法では効果が得られません.実現の構想は,Ajaxリクエストであることが判明したら,特定のフォーマットのJsonデータを返し,クライアントがこのデータを処理し,Sessionが失効していることを発見し,ログインページにジャンプすることである.
まず、私たちのMyAuthorizeAttributeを拡張します.[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
if(!filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new RedirectResult(redirectUrl);
}
else
{
filterContext.Result = new JsonResult
{
Data = new
{
Success = false,
Message = string.Empty,
Redirect = redirectUrl
}
};
}
return;
}
}
要求がAjaxから来た場合、クライアントが処理するコードは次のようにJson Resultを返します. $.ajax({
type: "POST",
url: "@Url.ContactInfoAjax()",
success: function (msg) {
if (msg.Success) {
…….
}
if (msg.Redirect) {
window.location = msg.Redirect;
}
}
});
四、Sessionの期限切れ異常の処理の重要性
正直に言うと、開発者がプロジェクトを開始するとき、コード実装の機能、すなわちプログラムの「正常」な動作時の状態に注目することが多いが、「非正常」の場合、考慮することは少ない.これらの方面の考慮に対して、やっと私たちをもっと専門的なプログラマーになって、菜鳥の立場から抜け出すことができます.
趙さんは資料を調べたところ、MVCのAuthorizationFilterが実際にControllerにアクセスする前に、リクエストをブロックできることが分かった.この時、ここでSessionの有効性をチェックすることができ、Sessionが失効したことを発見したら、ユーザーをログインページに移すことができる.(MVCフィルタについてはここ)
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
filterContext.Result = new RedirectResult(redirectUrl);
return;
}
}
}
三、Ajax要求の中で、Sessionが失効する処理
Ajaxリクエストでセッションが期限切れになった場合、上記の方法では効果が得られません.実現の構想は,Ajaxリクエストであることが判明したら,特定のフォーマットのJsonデータを返し,クライアントがこのデータを処理し,Sessionが失効していることを発見し,ログインページにジャンプすることである.
まず、私たちのMyAuthorizeAttributeを拡張します.[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
if(!filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new RedirectResult(redirectUrl);
}
else
{
filterContext.Result = new JsonResult
{
Data = new
{
Success = false,
Message = string.Empty,
Redirect = redirectUrl
}
};
}
return;
}
}
要求がAjaxから来た場合、クライアントが処理するコードは次のようにJson Resultを返します. $.ajax({
type: "POST",
url: "@Url.ContactInfoAjax()",
success: function (msg) {
if (msg.Success) {
…….
}
if (msg.Redirect) {
window.location = msg.Redirect;
}
}
});
四、Sessionの期限切れ異常の処理の重要性
正直に言うと、開発者がプロジェクトを開始するとき、コード実装の機能、すなわちプログラムの「正常」な動作時の状態に注目することが多いが、「非正常」の場合、考慮することは少ない.これらの方面の考慮に対して、やっと私たちをもっと専門的なプログラマーになって、菜鳥の立場から抜け出すことができます.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
if(!filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new RedirectResult(redirectUrl);
}
else
{
filterContext.Result = new JsonResult
{
Data = new
{
Success = false,
Message = string.Empty,
Redirect = redirectUrl
}
};
}
return;
}
}
$.ajax({
type: "POST",
url: "@Url.ContactInfoAjax()",
success: function (msg) {
if (msg.Success) {
…….
}
if (msg.Redirect) {
window.location = msg.Redirect;
}
}
});
正直に言うと、開発者がプロジェクトを開始するとき、コード実装の機能、すなわちプログラムの「正常」な動作時の状態に注目することが多いが、「非正常」の場合、考慮することは少ない.これらの方面の考慮に対して、やっと私たちをもっと専門的なプログラマーになって、菜鳥の立場から抜け出すことができます.