2

Web アプリケーションのセッション全体で永続化する必要がある JSP/Struts アプリケーションでユーザーが変更できる「変数」があります。変数が設定および表示された (アプリケーションにとどまっている) ページから離れて移動する可能性があり、戻ってきたときに、その変数に最後に設定した値がまだ存在している必要があります。

明らかな選択は、それをセッション属性として保存することです。そして、それは私が数年前にやったであろうことです。ただし、Internet Explorer 8 以降では、Web アプリのユーザーは、同じサイトに対して開いているすべてのブラウザーに対して 1 つのセッションを持つことになります。つまり、ユーザーが私のアプリケーションをブラウザーで開き、別のブラウザーでもう一度開くと、1 つのセッションが共有されます。そのセッションを表す Cookie を共有していると思います。その結果、あるブラウザのセッションで値を変更すると、その値は他のブラウザでも変更されます。

私のユーザーは、1 つのワークステーションで Web アプリを複数回実行します。異なるブラウザー ウィンドウ (またはタブ) で上記の変数に異なる値を設定し、そのために異なる値を保持できるようにする必要があります。ブラウザー (またはタブ) の有効期間を制限しますが、同じアプリケーションに対して開いている他のブラウザー (またはタブ) には影響しません。

したがって、私が知る限り、セッション属性を使用することは問題外です。(まあ、IE -nomerge オプションがありますが、ユーザーにそのオプションを使用して IE を強制的に起動させる方法はありません)。

この問題に対処したのは私が最初ではないことを願っています。誰かがエレガントに解決し、その人がこの投稿を読んで返信します。

4

1 に答える 1

2

すべてが同じセッションIDを返す場合、サーバーが異なるタブまたはウィンドウを区別する方法はありません。ただし、そのような機能が必要な場合は、URLに「違い」を組み込むことを検討します。たとえば、あるタブには/ myapp / xxxxx /があり、別のタブには/ myapp /yyyyy/があるとします。は両方とも同じセッションを共有する可能性がありますが、サーバーはそれらを区別できます。ブラウザが常に魔法の部分(例:xxxxx)をどこかに返す限り、URLの実際の形式はそれほど重要ではありません。サーバー側では、セッションIDとリクエストを行っているURLに基​​づいて、セッションごとに複数の番号を追跡できます。

決定する唯一のことは、新しいURLを割り当てる必要があるため、新しいタブまたはウィンドウが開いたことにどのように気付くかですが、それは単なる配管工です。たとえば、URLと一致するように設定する必要があるローカルjs変数がある場合、新しいタブを開いたときにこの変数は一致しないため、新しい適切なURLに移動してローカル変数を設定できます。

于 2012-09-13T19:45:37.177 に答える