0

Cookieが関与しないPHPアプリに基本的なログインシステムを実装したいと思います。つまり、ユーザーがブラウザを閉じてログインの有効期限が切れると、ブラウザセッション中(またはユーザーが明示的にログアウトした場合)はアクティブなままになります。

このすべてのアクティビティをログに記録したいのですが、ユーザーがページを更新したり、別のリンクを開いたり、ログアウトしたりするたびに、そのユーザーが行った最後のアクセスとしてその時間を記録し、以前のアクセスログを上書きすると思います。

しかし、私の問題は、最後のレコードを上書きするのではなく、いつ、どのように別のレコードをデータベースに挿入する必要があるかということです。

タイムアウトを定義するだけで、最後のアクセスがそのタイムアウトを超えて行われた場合は、別のログをデータベースに挿入する必要がありますか?そのタイムアウト後にセッションも期限切れにする必要がありますか?

それとももっと良い方法はありますか?

理想的には、ブラウザを閉じたときに「ログアウトアクション」をログに記録したいのですが、それを検出する方法はないと思いますか?

提案?

4

3 に答える 3

2

ここでの本当の問題は別です。なぜこれが必要なのですか?つまり。それは私には非常に簡単に思えます:

  1. すべてのWebサイトのページを取得し、最初の行に次のようなものを追加し、そのメソッド内にデータベースに接続して、ネイティブ関数であるsession::recordAction()タイムスタンプを記録します。time()設計設定とスキーマに基づいているため、データベース内のどこにそのフィールドを配置するかは実際には重要ではありません。
  2. ユーザーが最後にオンラインであったかどうかを知りたい場合、たとえば10分間、2つのタイムスタンプ(データベースに記録したタイムスタンプとtime())を比較して、次のように言うことができます。

    if(session :: getLastAction()<10 * $ minutes){/*ここでクールなことをしてください*/}

  3. セキュリティ上の問題などが発生した場合にアクションログを回復するためにアクションログを記録する場合、そのタイムスタンプはユーザーが最後にページを更新したことを意味することを覚えておく必要があります。この場合、.txtファイルを使用してそれらを記録し、そのユーザーから回復できるIPとすべてのデータも記録することをお勧めします。したがって、理由もなくデータベースを使いすぎているわけではありません。

他の目的でこのシステムを構築している場合は、私に教えてください。この方法ですべての問題を解決する方法をお知らせします。

チップ

実際にログアウトボタンを押す人はほとんどいないことを忘れないでください。彼らはWebサイトを離れるだけです。そして、彼らがウェブサイトを離れる場合、それを実際に知る方法はありません。実際には、サーバーにページを要求しておらず、1。Webサイトを離れた場合、または2. Webページを読んでいて更新されなかった場合に、発生する可能性があります。

知らせ

私がそれを間違えなかった場合、あなたはログインシステムを作るための何らかの方法を探していて、あなたはクッキーについて心配していました:

  • setcookie()ブラウザを閉じると、Cookieの有効期限が切れます(デフォルトでは、を使用)。過去のタイムスタンプを設定することでそれらを削除でき、非常に長い日付を設定して永久にライブにすることができます。それらは非常に便利であり、今でも多くの人々によって使用されています。
  • セッションは、非アクティブの24分または22分後に期限切れになります(わからない、グーグルで検索してください)。

説明を求めるだけでなく、理解できたと思います。:)

于 2011-01-03T02:31:49.310 に答える
1

サーバー側のタイムアウトについてはすでに説明したので、ここで私の答えを少し修正します…。

クライアント側で実行できる唯一のことは、onbeforeunloadイベントを使用してログアウトページを呼び出すことです(ユーザーがドキュメント内のリンクをクリックしなかった場合)。

残念ながら、ブラウザの[戻る]、[進む]、[更新]ボタンを押すと、ログアウトが発生します...
これを回避するには、logout.php(自動ログアウトページ)を20〜30秒間スリープさせてから、最後のインプレッションがログアウトする前の30〜45秒…</ p>

これをドキュメントの先頭にあるスクリプトタグに追加し、「logout.php」を任意の名前に変更します… * リンク以外のものを使用する場合は、window.onload関数を編集してonclickハンドラーを正しく追加する必要がある場合もあります。ナビゲートするには…。

    var xmlhttp=false; var target; var combo;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } }
@end @*/
if (!xmlhttp && typeof XMLHttpRequest!='undefined') { 
    xmlhttp = new XMLHttpRequest(); 
}
var dologout = true;
var logouturl = 'logout.php';
window.onbeforeunload = function() { 
    if (dologout) {
        xmlhttp.open("POST", logouturl, true); 
        xmlhttp.send(null); 
    }
}
window.onload = function() { 
    for (i=0;i<document.links.length;i++) 
    document.links[i].setAttribute("onclick","dologout = false;"); 
}

基本的に、これはonclickイベントをすべてのdocument.linksに添付し、ドキュメントリンクがクリックされた場合は「dologout」フラグをfalseに変更します...

onbeforeunloadイベントが発生したときにdologoutフラグがtrueの場合、「logouturl」/「logout.php」に投稿が送信されます...

于 2011-01-03T02:15:40.200 に答える
-1

ブラウザを閉じたときに価値のあるアクションをトリガーする方法はありません。http://www.webdeveloper.com/forum/showthread.php?t=93810このリンクで、ユーザーが同様の質問をしました。彼が抱えていた問題は、ユーザーがWebページを離れるたびに発生することだと思います。彼らがサイトを離れているように思われるので、これはあなたのロギング活動を妨げるでしょう。私はクッキーを使用して、それらを頻繁に期限切れにします。ユーザーがサイトで有用なアクションを実行するたびに、ユーザーのアクションをログに記録します。つまり、リンクをクリックして、コンテンツを読むだけに費やしている時間に集中する必要はありません。

于 2011-01-02T20:47:22.203 に答える