2012-01-27 64 views
0

我目前正在使用Tonic PHP框架來構建一個RESTful應用程序(http://peej.github.com/tonic/),並且遇到了一個問題,我無法弄清楚如何在有人註銷後重定向用戶。奇怪的部分是登錄工作很好。Tonic RESTful應用程序不重定向

我的基本代碼作品列出了這一點:當用戶登錄時,他們填寫一個簡單的表單,按下一個提交按鈕,對錶單所在的同一頁面進行發佈請求。 (website.com/login)的後處理代碼如下所示:

public function post($request) 
{ 
    if(isset($_POST[ 'username' ]) && $_POST[ 'username' ] === 'username' && 
      isset($_POST[ 'password' ]) && $_POST[ 'password' ] === 'password') 
     { 
      $_SESSION[ 'loggedin' ] = true; 
      $response = new Response($request); 
      $response->addHeader('Location', '/'); 
      return $response; 
     } 
     else 
     { 
      $response = new Response($request); 
      $response->addHeader('Location', '/login/fail'); 
      return $response; 
     } 
} 

(當前的代碼只是暫時的事情,所以我可以測試功能)這將正確設置會話變量和重定向回我的索引頁面,用我的PHP代碼輸出所有正確的菜單和用於登錄的東西。

然後我遇到的問題是直接在我的網頁上的菜單欄內註銷註銷。我嘗試了兩種不工作的方法:一個簡單的錨定標記,其中href指向頁面webspace.com/logout,並且在菜單中僅使用重新提交的按鈕將表單放置爲正常鏈接,使用post作爲方法到同一頁面。他們都有這樣的代碼:

public function post($request) 
{ 
    $response = new Response($request); 
    $response->code = Response::MOVEDPERMANENTLY; 
    $response->addHeader('Location', '/'); 
    $response->body = "<b>Succesfully logged out!</b>"; 
    $_SESSION[ 'loggedin' ] = false; 
    return $response; 
} 

(或上至少一些變化,嘗試各種事物)當此代碼是從菜單欄中使用,無論是通過一個錨標記或表單提交按鈕,它會去到/註銷頁面,只停留在那裏,輸出任何正文文本(如果存在)。檢查用戶是否「登錄」的PHP代碼甚至不會觸發,使菜單欄處於當前登錄狀態,即使轉到其他頁面時它會更改爲已註銷代碼,這意味着您已經成功註銷。我嘗試了各種各樣的東西,直接通過瀏覽器欄直接進入就可以正常工作,而不會設置會話變量也會導致它正常工作。 (據我所見)我不知道發生了什麼。感謝您提前提供任何幫助。

回答

0

沒關係,我意識到了這個問題(這只是我的愚蠢):我在發佈Location頭之前正在輸出到頁面,導致它被瀏覽器忽略。在我的主頁上稍微改變一下操作順序就可以解決問題。

讓這是對所有人的警告:確保在將任何代碼回顯給瀏覽器之前發出標題,無論如何。就我而言,這要求我在HTML代碼之前爲當前URI執行所有處理代碼,然後將請求的輸出發送到瀏覽器的正確位置。