セッションタイムアウトが頻繁に発生する問題があります。私は、各コントローラに使用することができ、共通のフィルターを書きたいMVC 3でセッションタイムアウトを処理する方法
、フィルタは、ユーザーが最後にリクエストを送信し、そこからの奥にログインし、ログイン後にするユーザーをリダイレクトする必要があります。あなたはこのような何かを試みることができる
セッションタイムアウトが頻繁に発生する問題があります。私は、各コントローラに使用することができ、共通のフィルターを書きたいMVC 3でセッションタイムアウトを処理する方法
、フィルタは、ユーザーが最後にリクエストを送信し、そこからの奥にログインし、ログイン後にするユーザーをリダイレクトする必要があります。あなたはこのような何かを試みることができる
:
public class SessionExpireAttribute : ActionFilterAttribute {
public override void OnActionExecuted(ActionExecutedContext filterContext) {
base.OnActionExecuted(filterContext);
}
public override void OnActionExecuting(ActionExecutingContext filterContext) {
if (filterContext.HttpContext.Session != null) {
if (filterContext.HttpContext.Session.IsNewSession) {
var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];
if ((sessionCookie != null) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
// redirect to login
}
}
}
}
}
+1。リクエストがajaxであるかどうかを確認し、コンテンツタイプ '' text/javascript ''と' 'document.location =' redirecturi '" 'に対するレスポンスボディを設定することができます。 – jgauffin
@jgauffin私はmvcで新しいですので、 "document.location = 'redirecturi"のサンプルコードを提供できますか? –
は、既存の認可フィルタを試したことがありますか?
認可フィルタはセッションタイムアウトとは関係ありません。 –
前述したように...この
public class SessionExpireAttribute : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext) {
if (filterContext.HttpContext.Session != null) {
if (filterContext.HttpContext.Session.IsNewSession) {
filterContext.Result = new RedirectResult("/");//redirect to home page
}
}
}
}
を試した後、目を満たしているよりも、ここで多くのがありますアクションやコントローラ[SessionExpire]
の上にこのフィルタを適用します。ここでは、すでに説明したのと同じ概念を使用していますが、もう少し追加する、より完全なOnActionExecutingがあります。詳細については、インラインコメントを参照してください。呼び出される "InitializeSession"は、サイトを実行するためにSession Stateに必要な基本属性を作成するカスタム関数です。 「AlertWarning」は警告を表示するヘルパールーチンです。それ以外のものはすべて定型コードです。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var bRequiresAuthorization =
(filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0) ||
(filterContext.Controller.GetType().GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0);
if (filterContext.HttpContext.Session != null)
{
if (filterContext.HttpContext.Session.IsNewSession)
{
//New session. Initialize Session State
bool b = InitializeSession(null);
if (bRequiresAuthorization)
{
//Action requested requires authorized access. User needs to authenticate this
//new session first, so redirect to login
string cookie = filterContext.HttpContext.Request.Headers["Cookie"];
if ((cookie != null) && (cookie.IndexOf("_SessionId=") >= 0))
{
//An expired session cookie still resides on this PC, so first alert user that session is expired
AlertWarning("Session timed out due to inactivity. Please log in again.");
}
filterContext.Result = RedirectToAction("LogOut", "Authentication");
}
}
}
base.OnActionExecuting(filterContext);
}
ボイラープレートのVisual Studio MVCアプリケーションがこれを行います。私はそれを見てみることをお勧めします。ダビッドに感謝します。 –
私はそれを見つけることができませんでした。ありがとうございました – vivek
あなたの質問を編集して、それ以上のことを行い、関連するタグを使用しました。 – jgauffin