1. 程式人生 > >thinkphp登入判斷重定向問題

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.