3

私はRIAで働いています。Memcached を使用してセッションを保存します。http://pecl.php.net/package/memcache をインストールました。私の PHP セッション ハンドラーは次のようになります。

$session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10,  ,tcp://$host:$port  ";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);

セッションのタイムアウトは 30 分に設定されています。私の RIA では、定期的に AJAX 経由でサーバーサイド スクリプトを呼び出して、訪問者のセッションがまだ有効かどうかを確認したいと考えています。ajax 呼び出しが false を返した場合、画面をブラックアウトし、かなりの relogbox を表示してセッションを続行します。

問題はサーバーサイドスクリプトにあります。セッションが存在する場合、セッションの有効期間を延長せずにセッションが存在するかどうかを判断する必要があります。

私はセッション ハンドラーの仕組みについて完全に知っているわけではありませんが、これを行うかどうかはかなり確信しています。

<?
session_start();
if($_SESSION['loggedin'] == "yes")
    echo "true";
else 
    echo "false";
?>

これにより、セッションの有効期間が更新されると確信しています(サーバー側だけでなく、新しいCookieをクライアントに送り返すことによりクライアント側でも)。そして、セッションは無期限に存在します。

私が検討したが除外したいくつかのオプション:

  • サーバー側の呼び出しは行わず、クライアントで JavaScript タイマーを使用します (たとえば、30 分後に期限切れになります)。ユーザーが複数のウィンドウで RIA を開いている場合、これは機能しません。
  • session_start() をハックして、新しい新鮮な Cookie をクライアントに送り返さないようにしてください。これはクライアント側で機能する可能性がありますが、有効期限は内部の session_handling で更新されます。

アイデアが欲しいです、ティア

4

2 に答える 2

1

セッション タイムアウトと認証タイムアウトを同一視する必要はありません。ユーザーがログインしたときのタイムスタンプである追加の変数をセッションに保存することをお勧めします。セッションが存在しない場合、またはタイムスタンプが古すぎる場合は、ユーザーがログアウトしたと見なすことができます。副作用として、設定した時点でセッションが期限切れになるとは限りませんが、ガベージ コレクションが実行されるまでの時間が長くなる可能性があるため、追加の精度も得られます。

実際のところ、この機能を単純なクラスにラップして、次のようにすることをお勧めします。

$acl->logIn($username); //set the user as logged in
$acl->isLoggedIn($username); //Is he still logged in?

などなど

于 2010-06-04T12:56:16.870 に答える
0

Javascript だけでユーザーを検証しないでください。あなたは深刻なセキュリティ問題を求めているだけです。

$_SESSION['loggedin'] を Ajax で確認する最初の方法は機能します。以前のセッションが期限切れになっている場合、続行する前に新しいセッション ID が生成されるため、$_SESSION['loggedin'] は設定されません。

于 2010-06-04T12:52:58.973 に答える