-
1 # A小陳同學A
-
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、登出操作
回覆列表
在session里加入一個IP的變數。繫結使用者如果發現IP和現有繫結使用者不一致就更新到實時登入的賬戶名就可以了