2012-01-27 87 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执行所有处理代码,然后将请求的输出发送到浏览器的正确位置。