ブラウザでのセッションの有効期限の追跡

そのため、AJAXパーツが手動とフレームワークの両方で実行される、複雑な異種Webアプリケーション、複数のポップアップウィンドウなどがあります。大きな立派なクライアントが、すべてのWebで無効化、閉じる、またはその他のアクティビティを実行する必要があるとアプローチします。 HTTPセッションがタイムアウトするとアプリケーションウィンドウ。HTTPセッションのタイムアウト間隔を制御する方法を知っているといいのですが、J2EE準拠のWebアプリケーションの場合、web.xmlファイルから実行されます(ただし、多くのアプリサーバーでは、標準的な方法では実行されません)。10分間のタイムアウトの場合、次のようになります。

  10  

クライアントの要件はまったくばかげているわけではなく、エンドユーザーの観点からは完全に理にかなっていますが、次の理由で開発者にとってひどい苦痛になる可能性があります。1。ページが読み込まれるたびにブラウザウィンドウでカウントダウンタイマーを開始することはできません。タイムアウト時にウィンドウを閉じます。このアプローチは、ブラウザとサーバーの相互作用のたびにブラウザウィンドウが再読み込みされる場合に、AJAX以外の世界で機能しました。 2.サーバーにクエリを実行してHTTPセッションがタイムアウトしたかどうかを確認することはできません。このようなクエリはそれぞれ、セッションを延長するブラウザとサーバーの相互作用として扱われるためです。これにより、セッションが期限切れになることはありません。 3.プライマリWebアプリのHTTPセッションを認識し、それと交差する別のWebアプリケーションを作成できます。しかし、それはやり過ぎです、統合の問題が発生する可能性があるため、このようなソリューションが受け入れられる可能性は非常に低くなります。 4.高度なハックのようなコードを使用して、すべてのAJAXブラウザーとサーバーの相互作用を傍受しようとすることができます。これは、現在のウィンドウを処理するのに役立ちます。ただし、これは複数のウィンドウが開いている場合には機能しません。ブラウザウィンドウ間で通信できないだけです。開いているウィンドウとプライマリウィンドウから通信する唯一の方法は、他のウィンドウのJavaScript参照を使用することです。プライマリウィンドウが再読み込みされるか、別の場所に転送されると、他のウィンドウへのJavaScript参照がすべて失われます。 5.最も現実的なアプローチは、{セッションの最大非アクティブ間隔} +10秒ごとにサーバーに対して(開いている各ウィンドウから)定期的なJavaScriptXMLHTTP要求を行うことです。これにより、最終的にすべてのウィンドウが閉じます。ただし、HTTPセッションが破棄された後、たとえばユーザーがプライマリウィンドウ内からログアウトすると、ウィンドウが数分(またはWebアプリセッションのタイムアウト設定によっては数時間)閉じられる場合があります。これ以上の選択肢はありません。あなたはイライラしていて、明日学校でパパの銃を持ってクラスメートを撃つのにちょうどいい時期だと思います。いいえ、まだ子供ではありません-まだ道はあります!出口はそれほど単純ではありませんが、非常にエレガントです。クッキーは私たちを助けます。クッキーの有効期限がうまくいくと考える人もいるかもしれません。残念ながら、明日、パパの銃を持ってクラスメートを学校で撃つのにちょうどいいタイミングです。いいえ、まだ子供ではありません-まだ道はあります!出口はそれほど単純ではありませんが、非常にエレガントです。クッキーは私たちを助けます。クッキーの有効期限がうまくいくと考える人もいるかもしれません。残念ながら、明日、パパの銃を持ってクラスメートを学校で撃つのにちょうどいいタイミングです。いいえ、まだ子供ではありません-まだ道はあります!出口はそれほど単純ではありませんが、非常にエレガントです。クッキーは私たちを助けます。クッキーの有効期限がうまくいくと考える人もいるかもしれません。残念ながら、

この

記事では、Cookieの有効期限はクライアントブラウザによって測定されるため、信頼することはできません。また、クライアントのシステムクロックが1年遅れていないことを保証することはできません。そこで、異種WebアプリケーションでHTTPセッションのタイムアウトを追跡するためのシステムと方法を次に示します。ブラウザからサーバーへのリクエストごとに、サーブレットフィルタによって2つのCookieが設定されます。 1つはサーバーの現在の時刻を保持し、もう1つはセッションの有効期限を保持します。サーバーの現在時刻は、クライアントとサーバー間のオフセットを計算するためにのみ必要です。次に、セッションの有効期限が_計算された_現在のサーバー時間に対して定期的にチェックされます(オフセットを覚えておいてください)。サーバーに対して_any_リクエストが行われるたびに、有効期限Cookieが更新され、すべてが正常に機能します。実際には、この方法は3つのステップで実現されます:1。Webアプリケーションへのすべてのリクエストをフィルタリングするサーブレットフィルタを作成します。次のようにweb.xmlで構成します。

  SessionTimeoutCookieFilter some.package.SessionTimeoutCookieFilter   SessionTimeoutCookieFilter /*  

Webアプリのパフォーマンスについて心配する必要はありません。このフィルターは非常に原始的であり、応答に2つのCookieを追加するだけです。

 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse httpResp = (HttpServletResponse) resp; HttpServletRequest httpReq = (HttpServletRequest) req; long currTime = System.currentTimeMillis(); long expiryTime = currTime + session.getMaxInactiveInterval() * 1000; Cookie cookie = new Cookie("serverTime", "" + currTime); cookie.setPath("/"); httpResp.addCookie(cookie); if (httpReq.getRemoteUser() != null) { cookie = new Cookie("sessionExpiry", "" + expiryTime); } else { cookie = new Cookie("sessionExpiry", "" + currTime); } cookie.setPath("/"); httpResponse.addCookie(cookie); filterChain.doFilter(req, resp); } 

パス(この場合は「/」)を設定することは非常に重要です。パス設定を省略すると、ブラウザはURLからパス設定を自動的に計算するため、ブラウザのCookieストレージ内で混乱が生じます。2.サーバーとクライアントの時間の間のオフセットを計算するために、各ウィンドウに小さなJavaScriptが必要です。一度だけ実行する必要がありますが、ページの読み込みごとに実行しても問題はありません。

 function calcOffset() { var serverTime = getCookie('serverTime'); serverTime = serverTime==null ? null : Math.abs(serverTime); var clientTimeOffset = (new Date()).getTime() - serverTime; setCookie('clientTimeOffset', clientTimeOffset); } window.onLoad = function() { calcOffset(); }; 

3.最後に、セッションがタイムアウトしたかどうかを実際にチェックする関数が必要です。定期的に、この場合は10秒(または10000ミリ秒)ごとに実行する必要があります。

 function checkSession() { var sessionExpiry = Math.abs(getCookie('sessionExpiry')); var timeOffset = Math.abs(getCookie('clientTimeOffset')); var localTime = (new Date()).getTime(); if (localTime - timeOffset > (sessionExpiry+15000)) { // 15 extra seconds to make sure window.close(); } else { setTimeout('checkSession()', 10000); } } 

実際、セッションの満了時にブラウザウィンドウを閉じることは純粋な残虐行為であり、セッションがタイムアウトする1分前のように警告メッセージがポップアップする可能性があります。私はあなたを受け取ることに本当に興味があります

重要なフィードバック

私の方法で。

このストーリー「ブラウザでのセッションの有効期限の追跡」は、もともとJavaWorldによって公開されました。