php sessionid 重复,php_ session_id 限制同一用户同时登录
出于信息安全的考慮,希望給每個能進入系統的人員一個賬戶,而不是所有人共用一個賬戶,并且一個賬戶同時只能一人登陸。剛開始的做法是登陸加鎖,當用戶登陸之后,對此用戶進行標記,若此用戶未下線狀態下進行第二次登陸嘗試,則禁止其登陸。這樣做就解決了單賬戶多用戶同時登陸的問題,但是實際操作中,卻遇到了更大的問題:用戶登陸過程中對其進行了加鎖,則用戶離開時就必須要進行解鎖操作,而很多用戶離開網站的習慣是直接點擊瀏覽器的關閉按鈕,這就導致無法解鎖,最終導致用戶正常登陸也受到限制。
那么如何友好的限制用戶賬戶登陸的呢?我們首先分析一下PHP是如何識別用戶是否登陸的。由于HTTP協議無狀態性的特點,我們無法通過它對用戶進行識別。一般來說,對用戶的識別主要通過cookie或session,它們之前最大的不同是cookie數據由客戶端存儲,每次向服務端發送請求時,客戶端把有效的cookie隨請求發送到服務端,而session數據由服務端存儲,服務端可以根據客戶端發送的特定cookie值來判定這些請求是否屬于同一請求。我們這樣對用戶進行登陸檢測:public?function?login(Request?$request)
{
$dl?=?$request?->input('dl','');
$password?=?$request?->?input('password','');
if($dl?==?''){
return?redirect('/')->with('danger','登錄帳號或密碼錯誤!');
}
if($password?==?''){
return?redirect('/')->with('danger','登錄帳號或密碼錯誤!');
}
$userinfo?=?User::where('dl',$dl)->first();
//?判斷用戶帳號是否存在
if(empty($userinfo)){
return?redirect('/')->with('danger','您輸入的帳號不存在!');
}
//?判斷密碼是否正確
if(md5($password)?!=?$userinfo['password']){
return?redirect('/')->with('danger','登錄帳號或密碼錯誤!');
}
return?redirect('/userinfo');
}
顯而易見,上面的代碼并不能實現我們想要的效果。想要達到我們想要的效果,我們只需要在上面代碼基礎上,再加一層session_id的驗證就可以了。用戶在登錄時儲本次會話的session id,當用戶再次登錄時,首先刪除之前用戶的session id,再把本次登陸的session id保存起來,這樣一來,原來的用戶就會被新用戶擠下線。public?function?login(Request?$request)
{
$dl?=?$request?->input('dl','');
$password?=?$request?->?input('password','');
if($dl?==?''){
return?redirect('/')->with('danger','登錄帳號或密碼錯誤!');
}
if($password?==?''){
return?redirect('/')->with('danger','登錄帳號或密碼錯誤!');
}
$userinfo?=?User::where('dl',$dl)->first();
//?判斷用戶帳號是否存在
if(empty($userinfo)){
return?redirect('/')->with('danger','您輸入的帳號不存在!');
}
//?判斷密碼是否正確
if(md5($password)?!=?$userinfo['password']){
return?redirect('/')->with('danger','登錄帳號或密碼錯誤!');
}
//用戶登陸限制
$session_id?=?Session::getId();
if($userinfo['session_id']?!=?$session_id){
//??session_id?其實就是?session?文件名,當然我是以?Laravel?框架為例,不同框架可能不一樣。
empty($userinfo['session_id'])???''?:?unlink(storage_path().'/framework/sessions/'.$userinfo['session_id'])?;
Cache::put('login_error',?'您的帳號在異地登錄,非本人操作請及時修改密碼。',?3);
User::where('uid',$userinfo['uid'])->update(['session_id'=>$session_id]);
}
return?redirect('/userinfo');
}
總結
以上是生活随笔為你收集整理的php sessionid 重复,php_ session_id 限制同一用户同时登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联通光纤路由器一个多少钱联通随身路由器是
- 下一篇: php 按钮的属性值,HTML butt