4

特定のページ(単一ページのWebアプリケーションを想定)が1つのブラウザータブでのみ開かれるようにするための最良のアプローチは何ですか?

Java Webアプリに認証があると仮定します。つまり、ユーザーはサインインする必要があります(Java Session APIを介して、どのページがどのユーザーによって表示されているかを識別できます)。

同じURLに対して別のタブを開くと、ユーザーは静的ページにリダイレクトされ、アプリケーションを別の場所(別のタブ)で開いていることを通知します。

私の現在のアプローチはJSESSIONID、すべてのブラウザのタブで使用できるCookieに保存されているため、同じブラウザのタブでは機能しません。

4

2 に答える 2

6

現在のユースケースは次のとおりです。

  1. ユーザーはブラウザタブを開き、アプリケーションページをロードしてログインします。

次に、ユーザーは2番目のブラウザータブを開き、アプリケーションページをロードし、すでにログインしています(ブラウザーには、すべてのタブまたはウィンドウで同じセッションCookieがあるため)。

また、ユーザーを制限して、2番目のタブを読み込んだときに、次のような警告メッセージが表示されるようにします。他の場所でこのサイトに既にログインしている場合は、そのウィンドウを使用してください。ウィンドウが開いていない場合は、ここでログアウトして、再度ログインします。

ほとんどのソリューションでは、セッションとともにアプリケーションのインスタンスのワンタイムトークンを保持する必要があります。アプリケーションが単一のページに読み込まれ、ユーザーにログインボックスが表示される場合、ユーザーがログインしたときに、ワンタイムトークンを送信し、それをjavascript変数に保存して、すべてのサーバーリクエストとともに送信できます。その後、ユーザーが新しいタブでアプリケーションをロードすると、ユーザーは初期データを要求し、サーバーはトークンが存在しないため、ログアウトするか、ウィンドウを閉じるか、すでにログインしているウィンドウに切り替える必要があることを示す応答を生成できます。

したがって、答えは基本的に、サーバー上のセッションにランダムな文字列を保存し、ログイン時にユーザーに提供し、すべてのリクエストにそれがないかどうかを確認して、ログアウトページにバウンスすることです。そして、WebクライアントのJavaScriptに、そのトークンを保存し、すべてのリクエストとともにサーバーに送信します。

于 2012-10-31T00:24:49.573 に答える
1

バックエンドへの非同期呼び出しを作成し(キーワード:長時間のポーリング)、バックエンドを介して1バイトを送信して存続させることができます。それが生きている限り、タブは開いています。2回目の電話がかかってきたら、それをテストできます。

于 2012-07-25T15:14:13.650 に答える