16

私は Apache で PHP を使用する Web アプリケーションに取り組んでいます。$_SESSION 変数は、ページ間で保持する必要がある情報にかなり使用されます。

各ユーザーは、ブラウザの選択に応じて、新しいタブまたは新しいウィンドウとして複数の同時セッションを開くことができる必要があります。現在、ユーザーが追加のタブまたはウィンドウを開いてサイトにアクセスすると、既存のセッションが採用されます。ユーザーが既に開いている既存のセッションに干渉することなく、ログインして新しいセッションを開始する必要がある (または可能性がある) ようにするにはどうすればよいですか?

私たちの一時的な回避策は、複数のブラウザー (IE と FF) を使用することですが、これは明らかにあまり望ましい方法ではありません。

4

5 に答える 5

10

あなたが説明する動作は、ブラウザ セッションの概念に反します。ユーザーが複数のセッションを必要とするのはなぜですか? ユーザーアクセス制御を実施する必要があるということですか? その場合は、ユーザーを論理グループに割り当て、特定のグループに権限を付与します。ユーザーは他のユーザーに代わって何らかのアクションを実行する必要がありますか? その場合は、1 人のユーザーに対して複数のセッションを作成しようとするのではなく、そのコンセプトに基づいて Web サイトを設計してください。

本当にこれを行う必要がある場合は、ページ間でクエリパラメーター (非常に安全ではありません) を渡してセッション ID として機能させ、実際の $_SESSION を完全にバイパスし、セッションの独自の概念を管理するなど、恐ろしいことを行うことができます。繰り返しますが、これは正常ではなく、将来的に頭痛/セキュリティの問題につながるだけです.

于 2011-05-20T03:22:21.687 に答える
2

非アトミック同時セッション管理アクセスは、次の疑似コード ロジックでシミュレートできます。

function main(){
  $locker = new SessionLocking();
  /** read elements the $_SESSION "cached" copy. **/
  $var1 = $_SESSION['var1'];
  $var2 = $_SESSION['var2'];
  /** Pseudo Atomic Read **/
  $locker->lock(); //session is locked against concurrent access.
  $var3 = $_SESSION['var3'];
  $locker->unlock(); //session is committed to disk (or other) and can be accessed by another script.
  /** Psuedo Atomic Write **/
  $locker->lock(); //session is locked against concurrent access.
  $_SESSION['var4'] = "Some new value";
  $locker->unlock(); //session is committed to disk (or other) and can be accessed by another script
}

CLASS SessionLocking {

private static $lockCounter=0;
private static $isLoaded=false;

function __constructor(){
  if (!self::$isLoaded) load();
}

private function load(){
 $this->lock();
 $this->unlock();
}

private function lock(){
  if ($lockCounter<1) try {session_start();} Catch(){}
  $lockCounter++; 
}

private function unlock(){
  if ($lockCount<1) return;
  $lockCounter--;
  if ($lockCounter<1) try {session_write_close();} Catch(){}
}
}
于 2012-04-18T15:20:50.020 に答える
1

可能であれば、これを行うのは非常に困難です。

セッションは、自分がどのタブにいるかを気にする必要はありません。

また、タブ 1 のセッション 1 が新しいウィンドウを開くとどうなりますか? 新しいセッションですか?

于 2011-05-20T03:00:15.933 に答える
-3

これを行う方法は次のとおりです。

- 最初に php.ini でセッション Cookie を無効にします。

session.use_cookies = 0

これにより、セッション ID の受け渡しに Cookie が使用されないようになります。

-then セッション ID を含めてすべての URL を生成していることを確認します (関数 session_id() を介して取得します。例:

print "<a href= \"http://www.example.com/".session_id()."&showlist=1\">show list</a>";
于 2016-03-12T08:28:30.163 に答える