2012-09-10 27 views
1

嘿,我所有在codeigniter視圖中都有一個javascript函數,它從代碼控制器函數中檢索一些信息,當用戶會話的超時達到時, 。在被調用PHP函數我有一個看起來像這樣的語句:當codeigniter/tank auth會話超時達到時處理php重定向

if (!$this->tank_auth->is_logged_in()) { 
    redirect(site_url('login'));} 

這重定向他們自己的登錄頁面,如果他們還沒有登錄然而,在javascript函數我採取的應對文字和設定的內容。一個div等於它。

xmlhttp = new XMLHttpRequest(); 
    xmlhttp.open("POST", "mycontroller/myfunction/", false); 
    xmlhttp.send(); 
    document.getElementById("mydiv").innerHTML=xmlhttp.responseText; 

如果用戶登錄時,他們調用此函數將返回登錄頁面的responseText的,並將其插入到DIV而不是重定向到登錄頁面。這看起來很糟糕。如果用戶會話在查看此頁面時超時,我該如何阻止它這樣做?我無法更改超時限制,因爲其他應用程序依賴它。

真的,這不是一個codeigniter或tank_auth問題,簡單地說就是如何從在ajax請求中調用的php函數重定向,而不是當我最初使用該函數爲responseText生成字符串時。

+0

只是爲了澄清,您是否在使用ajax請求的PHP文件中使用重定向? – dbf

+0

@dbf ajax請求是一個恰好檢查用戶是否登錄的文件,這對我的應用程序是必需的。如果他們沒有登錄,則將其重定向到登錄頁面。這裏的問題是,如果ajax請求在沒有登錄的時候發生,它仍然會調用那個返回重定向登錄頁面的responseText的php函數。 –

+0

只有當我理解正確時,如果登錄,將ajax請求調用的PHP文件的值更改爲簡單的'true'或'false',並將'document.getElementById(「mydiv」)'包裝進一個if語句,它只會在真正的情況下做出迴應,這意味着在我們的例子中「已登錄」。 – dbf

回答

1

您需要解析響應並確定它是否是您期望的響應類型。如果你期望在一定數量的字符下,你可以檢查長度,但這可能不如檢查特定的dom對象或字符串。

你可以做,例如:

if(xmlhttp.responseText.length < 200) { 
    document.getElementById("mydiv").innerHTML=xmlhttp.responseText; 
} else { 
    window.location.href = 'some url'; 
} 

另一種方法是使用CodeIgniter的AJAX請求 - 應答檢查做別的事情,而不是加載視圖(或加載不同的看法):

if ($this->input->is_ajax_request()) 
{ 
    // do something else 
} 
else 
{ 
    // do what you were doing before 
} 

希望這會有所幫助!我會迴避做PHP/CI方法,因爲它聽起來像你會在你的代碼中的任何地方添加異常,這不會很漂亮。不過,這完全取決於你。

+0

謝謝,這正是我期待的。 –

0

如果你很瞭解你的登錄設計。你可以像這樣處理你的迴應。

success: function (response) { 

if(result.substring(0, 15) == '<!DOCTYPE html>') //Your login's HTML initials. 
    window.location = site_url_path + 'login'; //session timeout redirection. 
//your normal functionality 

} 

當您在控制器的結構中編寫重定向時,這會很有幫助。