Perl:302重定向到另一个cgi脚本

时间:2016-02-27 09:07:47

标签: perl redirect state post-redirect-get session-management

对于作业,我建立一个以用户登录开始的Web应用程序。登录会话后创建,但刷新后,正在创建新的会话ID,因此状态不是保存。我已经读过使用POST-REDIRECT-GET方法不重新提交登录表单,我试图用我的脚本执行此操作。也许我误解了重定向的方式和内容,但下面的代码并不起作用。它是在用户通过身份验证后运行的子例程。什么出错的想法?​​

sub send_to_main {
    my $session = new CGI::Session(undef, undef, {Directory=>'/tmp'});
    $session->expires('+1d');
    my $cookie = $q->cookie(
        -name       => 'jadrn015SID',
        -value      => $session->id,
        -expires    => '+1h');
    print $q->header( -cookie=>$cookie ); 
    my $sid = $session->id;
    $session->param('user',$user); #added to make session more unique
    print $cookie;
    print $q->redirect(
         -uri=>"http://jadran.sdsu.edu/perl/jadrn015/proj1_scripts/main_app.cgi",
         -status=>302,
         -cookie=>$cookie
     );  

编辑: 我从服务器收到302消息,但它正被打印到我的html文档(我知道这是因为我在重定向之前打印了一个标题)。但是,如果我删除

print $q->header( -cookie=>$cookie );

然后没有任何作用,登录后,我的浏览器要么说找不到文件,要么试图下载脚本。

2 个答案:

答案 0 :(得分:1)

print $cookie;

以上获取cookie并将其输出到HTTP标头

my_array=(foo bar abc)
echo "${my_array[@]/?/.}"

以上获取cookie,将其转换为字符串,然后在HTTP 正文中输出。

  

打印$ q->重定向(

上面生成一个重定向HTTP标头......但是你已经启动了HTTP主体...所以它会以文本形式输出。

不要打印cookie的文本。

答案 1 :(得分:1)

正如其他人已经指出的那样,你打印的东西太多了。您应该打印的只是重定向指令。

print $q->redirect(
    -uri=>"http://jadran.sdsu.edu/perl/jadrn015/proj1_scripts/main_app.cgi",
    -status=>302,
    -cookie=>$cookie
);

需要删除所有其他打印报表。

你说:

  

如果我删除

print $q->header( -cookie=>$cookie );
     

然后没有任何作用,登录后,我的浏览器或者说是   找不到文件或尝试下载脚本。

在我看来,这是 工作的证据。看起来您的浏览器正在被重定向,并且您看到的错误归结为您的第二个URL(您重定向到的那个)不正确或配置错误。

您可以运行几个简单的测试来证明它正常工作。

  1. 使用curl或类似内容发出HTTP请求,并看到您获得了正确的302响应。浏览器是调试重定向问题的一种可怕方法,因为它们会不顾一切地隐藏实际情况。

  2. 尝试直接访问重定向网址。我怀疑你会遇到同样的问题,这将证明问题归结为URL,而不是你的重定向代码。