ロード関数での「メタリフレッシュ」JavaScriptなど、セッションタイムアウトを処理するさまざまな方法があります。
タイムアウトの5分前に、ユーザーに警告するなど、きちんとしたものが欲しいのですが...
また、ブラウザが開いている限りセッションを開いたままにすることも検討しています(ただし、その方法を理解する必要があります...おそらく更新されたiframeがあります)。
セッションタイムアウトをどのように処理し、どの方向に進むべきだと思いますか?
ロード関数での「メタリフレッシュ」JavaScriptなど、セッションタイムアウトを処理するさまざまな方法があります。
タイムアウトの5分前に、ユーザーに警告するなど、きちんとしたものが欲しいのですが...
また、ブラウザが開いている限りセッションを開いたままにすることも検討しています(ただし、その方法を理解する必要があります...おそらく更新されたiframeがあります)。
セッションタイムアウトをどのように処理し、どの方向に進むべきだと思いますか?
セッションのタイムアウトを処理するための最良のアプローチ。
基本的なケースは2つあると思います。
1つは、ユーザーがデータをほとんどまたはまったく入力せずに、レポートを読んだり、マウスで小さな考えをしたりする場合です。この場合、セッションが期限切れになることを彼に通知する簡単な方法はありません。コードビハインドを呼び出すセッションの残り時間を確認する場合は、セッションを自動的に更新します。次に、セッションをカウントダウンするタイマーがある場合、ユーザーがWebの新しいタブを開いてセッションが期限切れになる可能性がありますが、JavaScriptでメモした時間ではなく、ユーザーが間違ったメッセージを受信します。
したがって、私にとっては、ユーザーがデータをほとんどまたはまったく入力しない場合は、セッションを期限切れにするだけです。ワンクリックを失った場合は、後でもう一度やり直します。
2つ目は、ユーザーが多くのデータを入力する必要がある場合です。たとえば、長いテキストを書き込んで修正するには、時間がかかる場合があります。この場合、私は以下のテクニックを使用し、セッションを終了させません。
ブラウザが存在する限りセッションを開いたままにする方法。
これは非常に素晴らしくシンプルなテクニックです。JavaScriptを使用してセッションがタイムアウトする前にリロードする画像を使用します。
<img id="keepAliveIMG" width="1" height="1" src="/img/ui/spacer.gif?" />
<script language="javascript" type="text/javascript">
var myImg = document.getElementById("keepAliveIMG");
if (myImg){
window.setInterval(function(){
myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
}, 6000);
}
</script>
3番目のケースでは、これを行うことができます。セッションがポストバックでのみ期限切れになるかどうかは気になります。ユーザーがデータを入力し、ポストバックでアプリケーションがログインページにリダイレクトされると、ポストは失われます。
この3番目のケースでは、投稿データをキャプチャして、ユーザーが再ログインするまで保存できます。に投稿データをキャプチャしglobal.asax
ます
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
これはログインページへのリダイレクトの前に呼び出された関数であり、投稿データとログインに必要な使用法があるかどうかを確認し、その投稿データを新しいリダイレクトページに保存し、サーバーに保存します(おそらくセッション、おそらく一時データベース上)。
これで、ユーザーが再度ログインした後、保存された投稿データを含む最後のページにユーザーを再度リダイレクトし、ユーザーはそのまま続行されます。
ここでの唯一のトリックは、最後に投稿されたデータを使用してフォームをレンダリングし、javascript呼び出しを自動的にリダイレクトする中間ページを作成することです。
私が考えることができる唯一のことは、クライアントタイマーを作成するスクリプトをページ上に生成することです。これにより、ページが受信されてレンダリングされたときに、X分後(つまり、有効期限の5分前)にアラートを表示できます。
セッションを存続させたい場合は、AJAXを介して定期的に呼び出す汎用ハンドラー(ASHX)を使用してこれを行うことができます。これはセッションを更新するのに役立ち、AJAX呼び出しが続く限りセッションは存続するはずです。
例「keepalive.ASHX」:
<%@ WebHandler Language="C#" Class="keepalive" %>
using System;
public class keepalive : System.Web.IHttpHandler
{
public void ProcessRequest (System.Web.HttpContext context)
{
context.Response.ContentType = "text/json";
var thisUser = System.Web.Security.Membership.GetUser();
if (thisUser != null)
context.Response.Write("[{\"User\": \"" + thisUser.UserName + "\"}]");
}
public bool IsReusable
{
get { return false; }
}
}
そして、これを呼び出すためのページ上のスクリプトは次のとおりです(簡単にするためにjQueryを使用):
<script type='text/javascript'>
function keepAliveInterval()
{
$.ajax(
{
url: "keepalive.ashx",
context: document.body,
error: function () {
alert("AJAX keepalive.ashx error :(");
}
});
}
$(document).ready(function () {
window.setInterval('keepAliveInterval()', 60000);
});
</script>
web.configのセッションタイムアウト変数をキーオフするjqueryを使用します。このJquery遅延トリックを使用すると、特定の時間(ページのロード後x分)が発生すると、セッションタイムアウトをx分で示すdivがポップアップ表示されます。素敵で、清潔で、とてもシンプルです。
セッションタイムアウトに関しては、Codesleuthのajax呼び出しが最適です。