【问题标题】:Perl catalyst controller redirect not workingPerl催化剂控制器重定向不起作用
【发布时间】:2016-09-08 17:34:41
【问题描述】:

我查看了这段代码,但我无法理解它表现出的怪异之处。由于缺乏了解,我所知道的一切

$c->res->redirect('qbo/home');

被忽略,有利于在以下 if else 条件下进行重定向。换句话说,我总是在 OAuthentication 网站结束。

如果我阻止注释掉 else 条件,我最终会到达我想去的地方 qbo/home

sub index :Path :Args(0) {
    my ($self, $c) = @_;

    # Check to see if we have QBO::OAuth object in our user's session
    # Create new object in session if we don't already have one
    if(!($c->session->{qbo})) {
            $c->log->info('Creating QBO::OAuth, save in user session');
            $c->session->{qbo} = QBO::OAuth->new(
                    consumer_key => 'qyprddKpLkOclitN3cJCJno1fV5NzcT',
                    consumer_secret => 'ahwpSghVOzA142qOepNHoujyuHQFDbEzeGbZjEs3sPIc',
            );
    }

    # Now we set our object variable to the session old or new
    my $qbo = $c->session->{qbo};
    ######### GOTO 'qbo/home' ##########
    $c->res->redirect('qbo/home');
    ####################################
    if($c->req->params->{oauth_token}) {
            $c->log->info('Now Redirect to access_endpoint');
            # Get realmId and save it to our QBO::OAuth object in user session
            $qbo->realmId($c->req->params->{realmId});
            # Call QBO::OAuth->request_access_token
            my $r = $qbo->request_access_token($c->req->params->{oauth_verifier});
            $c->res->redirect('qbo/home');
    } else {
            my $callback = 'http://www.example.com/qbo';
            # Request a token
            my $r = $qbo->request_token($callback);
            if($qbo->has_token) {
                    #Continue on down, Redirect to auth_user_endpoint
                    $c->res->redirect($qbo->auth_user_endpoint . '?oauth_token=' . $qbo->token);
            }
    }
}

似乎我缺少有关其工作原理的一些基本原理。任何线索表示赞赏

【问题讨论】:

    标签: perl controller catalyst


    【解决方案1】:

    来自fine manual...

    这是一种方便的方法,它将 Location 标头设置为重定向目标,然后设置响应状态。如果您希望立即发生重定向,您需要return$c->detach() 中断正常的处理流程。

    还要注意该手册页上关于重定向到相对 URL 的警告 - 您不应该这样做。对于您的用例,我建议您养成使用的习惯:

    return $c->res->redirect($c->uri_for('qbo/home'));
    

    $c->res->redirect($c->uri_for('qbo/home')) && $c->detach();
    

    取决于你的喜好。

    【讨论】:

    • 我会接受第二个建议,但作为两个陈述,而不是 &&。这更容易阅读。
    • 我怀疑现在 OP 明白了为什么他所拥有的东西不起作用以及为什么,他会是对的。但我不相信“重定向和分离”不是完全可读和清晰的。这就是我们喜欢 perl 的原因 - TIMTOWTDI :-)
    • 好吧,我昨天确实设法解决了这个问题。在我提出这个问题后不久,我发现 return 语句会停止代码执行。我仍然认为我更喜欢选项#2,因为我理解得更好了。谢谢
    猜你喜欢
    • 2013-05-20
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多