回覆列表
  • 1 # A小陳同學A

    在session里加入一個IP的變數。繫結使用者如果發現IP和現有繫結使用者不一致就更新到實時登入的賬戶名就可以了

  • 2 # 武漢朝夕教育科技

    首先使用一個瀏覽器來訪問應用的一個頁面 multex_session1.php

    要記錄當前賬號所使用的sessionId,使用session_id()獲取到當前的sessionId

    然後用另一個瀏覽器和同一個賬號訪問另一個頁面 multex_session2.php

    在該頁面中會找到該賬號之前使用的sessionId,然後清除該sessionId儲存的所有內容,然後重新寫入session值,並將新的sessionId寫入redis中

    清除舊的sessionId使用的方法有 session_start() session_unset() session_write_close()

    具體程式碼:multex_session1.php

    <?php

    $redis = new Redis();

    $redis->connect("192.168.1.102",6379);

    session_start();

    $curSessionId = session_id();

    echo "sessionId=".$curSessionId."<br/>";

    $userSession = $redis->get("online:1");

    echo "userSession:{$userSession},user_id:{$_SESSION["user_id"]},user_name:{$_SESSION["user_name"]}";

    $_SESSION["user_id"] = 1;

    $_SESSION["user_name"] = "areyouok";

    $redis->set("online:1", $curSessionId);

    $redis->expire("online:1", 1800);

    session_write_close();

    multex_session2.php

    <?php

    session_start();

    $curSessionId = session_id();

    echo "sessionId=".$curSessionId."<br/>";

    session_write_close();

    $redis = new Redis();

    $redis->connect("192.168.1.102",6379);

    $oldSession = $redis->get("online:1");

    if (!empty($oldSession) && !empty($curSessionId) && $curSessionId != $oldSession) {

    echo "oldSession not equal new sessionId<br/>";

    $redis->set("online:1", $curSessionId);

    $redis->expire("online:1", 1800);

    session_id($oldSession);

    session_start();

    if (ini_get("session.use_cookies")) {

    $params = session_get_cookie_params();

    echo "arrive here,".json_encode($params)."<br/>";

    setcookie(session_name(), "", time() - 42000,

    $params["path"], $params["domain"],

    $params["secure"], $params["httponly"]

    );

    }

    unset($_SESSION["user_id"]);

    unset($_SESSION["user_name"]);

    session_unset();

    session_write_close();

    session_id($curSessionId);

    session_start();

    echo "oldSession:{$oldSession},user_id:{$_SESSION["user_id"]},user_name:{$_SESSION["user_name"]}";

    $_SESSION["user_id"] = 1;

    $_SESSION["user_name"] = "areyouok";

    session_write_close();

    }

  • 3 # 程式設計師小助手

    試著回答一個。往少了說,往小了說。

    如何獲取客戶端IP地址

    不要信任客戶端發開的資料。大多數情況可,$_SERVER["REMOTE_ADDR"] 獲取到的資料較為可靠。

    如果客戶端使用代理伺服器來的訪問,會攜帶 $_SERVER["HTTP_X_FORWARDED_FOR"] 變數。

    正常情況下,將上述兩個值,分別存入資料庫欄位,用來驗證,基本可以鎖定大多數的IP。

    Session

    有了上述的ip識別身份,兩個值的組合,組成唯一值,作為鍵值。

    ip最好不用string直接儲存,php提供了ip2long將ip地址轉換為整型。

    那麼建立session的時候,鍵值就可以使用比如 "ip_filter_647384_9387120" 這樣的形式儲存。

    下次請求過來,根據鍵值查詢,如果有,return false; 如果沒有,next就可以了。

    是否使用框架

    沒有用框架,那就用php寫,session用檔案儲存,訪問量小,磁碟io可忽略不計的情況下,沒問題,可以執行的很好。

    使用框架,還是推薦使用memcached / redis這樣專用的記憶體資料庫用於鍵值管理。何也?效率高,且便於管理!

    以上。

  • 4 # 網路圈

    我們知道,Session和Cookie配合起來使用可用來實現會話跟蹤與控制。在一些場景下可能需要做單IP限制登入,很多開發者可能就會想到用Session會話來實現,但是不能單獨靠Session來實現單IP限制登入。

    第一步:單IP登入限制需要基於會話控制

    這個很好理解,既然有登入,那就離不開會話控制技術(Cookie+Session),當用戶成功登入後,我們需要獲取到使用者的IP,同時標記會話狀態,這樣此使用者後續的請求都會歸屬於此會話中。

    第二步:使用者登入後要將使用者IP儲存起來

    基於第一步,當用戶登入成功後,就需要獲取使用者的真實IP,然後儲存起來。常見的儲存方式有:快取檔案、資料庫、檔案。考慮到效能,我們建議可以將使用者的真實IP儲存到Redis這類NoSQL中。

    具體思路是:使用者登入成功後 =》獲取使用者真實IP =》從資料庫中找到當前登入使用者的唯一ID值 =》將使用者唯一UID做為Redis的Key儲存,其Value則為此使用者的IP。

    第三步:每次登入與登出都要更新對應的Redis Key對應的值

    上面2步做好後,然後需要對登入與登出邏輯做處理了,具體規則如下:

    1、每次登入成功後

    每次登入操作時,驗證使用者名稱及密碼正確後需要檢視此使用者的UID對應的Redis Value值(如果Cookie+Session狀態都存在也需要判斷Redis中是否有值),如果Redis中有值,則代表此使用者之前登入過,再進一步判斷使用者當前的IP是否和上次登入的IP一致,如果不一致則代表使用者在多處登入了,再根據業務做進一步處理。

    2、登出操作

  • 中秋節和大豐收的關聯?
  • 北魏到隋唐時代的軍事力量比起當時的薩珊波斯帝國如何?