thinkphp登入判斷重定向問題
我們在寫網站的時候經常會出現這種情況,登入的時候,老是說你的頁面中包含迴圈重定向的內容.
下面我就來說明一下幾種常見的情況.
在thinkphp中,如果是後臺的話,要求必須登入才能進入到主管理介面.那麼我們可以通過這種方法來實現.
在控制器中建立一個 CommonController 通用控制器,然後在裡面寫一個
public function _initialize(){
//檢查是否有session('username')的內容,如果沒有則跳轉到登入頁面...
沒有登入,則跳到登入控制器
$this->error("請登入",'login/login');
然後後臺所有的控制器都要繼承這個CommonController ,並且在每個控制器中都寫這個函式
public function _initialize(){
parent::_initialize();//必須寫上這一句,否則子類將會複寫父類的方法,這樣父類的驗證操作就失效了..
}
這裡有沒有考慮過這樣的問題....
如果我們的登入控制器是LoginController ,也繼承這個CommonController的話,問題就來了,當你登入到後臺的任何一個頁面時,都會提前進行CommonController的_initialize檢查登入操作,沒有登入,則跳到Login控制器,好了跳到Login控制器之後,又將呼叫CommonController的_initialize 函式..這就是問題的所在了...
解決方案,要麼LoginController不繼承CommonController,要麼在LoginController中的必須寫_initialize()
但是不要執行父類的_initialize()
public function _initialize(){
//做你想做的事情..
//不要使用parent::_initialize();即可
}
好了,如果是前臺呢,前臺分為幾種情況.一種是必須登入,一種是部分模組需要登入.
對於必須登入的這種情況和後臺類似了.
下面我們來說說部分模組需要登入的情況.
同樣使用後臺的方法...
我們可能需要就是當我點選某個模組之後,檢查是否登入,沒有登入則登入,登入完畢之後跳入我剛才點選的模組.
這裡的問題是我們怎麼儲存我們之前點選的內容的呢..
這裡有很多種解決方案,比較好的就是使用ajax方法實現.頁面無重新整理動態提交,還有我們可以在相應需要登入的模組直接將登入的模板引入進來.
不知大家是否意會到我的思路..
就是我們加入進入到我的部落格模組.
public function index(){
if(not_login){
$this->display("將登入的檢視引入進來");
exit;
}
else{
///////
}
}
當然相對於的我們的登入控制器在登入成功之後就不要跳轉了....直接返回登入成功即可..
public function login(){
if(success){
$this->success('登入成功!');
}
}
好了,搞定.
這是PHP中的實現,在Laravel框架或者其他的模組中,我們都要考慮這些問題...
我們使用過濾器來解決這個問題,同樣的,我們不要在登入的路由上面增加這個過濾器就可以了.
還有一種情況是,如果你在過濾器中這麼寫
if(檢測成功){
//跳轉到首頁..
}else{
//跳轉到登入....
}
這塊就有個問題了..如果你統一跳轉到首頁,好,第一次程式檢測到你沒有登入,然後跳轉到登入介面,當你登入完畢之後,
系統將會跳轉到首頁...
在首頁的控制器中,又將判斷是否登入,發現登入,又跳到首頁....
這樣也是會出現迴圈重定向的...
解決辦法,在過濾器中就不要寫成功嘛,直接檢測失敗不就行了..
要是想成功直接跳轉到首頁,,其登入那裡寫,如果登入成功,就統一跳轉到首頁..
好了,希望你能看懂它.
Persistence makes life valuable .
Best Wishes.