2016-02-27 99 views
0

对于一个任务,我正在构建一个以用户登录开始的Web应用程序。创建登录会话后,但刷新后会创建新的会话标识,因此状态没有被保存。我读过关于使用POST-REDIRECT-GET方法不重新提交登录表单的问题,我正在尝试使用我的脚本执行此操作。也许我误解了如何以及重定向到什么,但下面的代码不起作用。这是用户通过身份验证后运行的子例程。任何错误的想法?Perl:302重定向到另一个cgi脚本

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); 

然后没有什么作品,在登录后,我的浏览器或者说,文件找不到,或者尝试下载该脚本。

+3

你是什么意思*“不工作”*?您的浏览器是否收到302消息?什么是'$ q'? – Borodin

+0

$ q =新的CGI; 当我取消注释行“#print $ q->标题(-cookie => $ cookie);”该页面可以工作,但是重定向被打印到html文档上(因为它不再是第一个标题)并且它会显示“确定文档已经移到这里”并且带有链接。但是如果行“#print $ q-> header(-cookie => $ cookie);”被注释掉了,当用户登录时它会尝试下载cgi文件......很奇怪。 perl非常新,所以我不知道发生了什么事情!感谢您的回应。 @borodin – Ybarra

+1

从[手册](https://metacpan.org/pod/distribution/CGI/lib/CGI.pod#CGI.pm-HAS-BEEN-REMOVED-FROM-THE-PERL-CORE):* CGI .pm不再被认为是开发Web应用程序的好习惯,包括快速原型开发和小型Web脚本。在这个时候,有更好,更清洁,更快,更简单,更安全,更可扩展,更可扩展,更现代化的替代方案。这些将通过[CGI :: Alternatives](https://metacpan.org/pod/CGI::Alternatives)进行记录。* – Quentin

回答

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

上述发生在HTTP头

print $cookie; 

上述取饼干,将其转换成字符串cookie并将其输出,然后输出它在HTTP 主体

打印$ Q->重定向(

上面产生一个重定向HTTP头...但是你已经开始了HTTP的身体......因此它的输出文字。


不要打印cookie的文本

+0

但是当我提到第一行时提到“print $ q-> header(-cookie => $ cookie);”,代码就停止工作。任何想法为什么?我只是为了测试目的而打印cookie,绝对要把它拿出来! @Quentin – Ybarra

+0

@Ybarra - 那不是我告诉你拿出的线。我告诉你要删除的行是'print $ cookie',它在生成头文件之前生成HTTP正文。 – Quentin

+0

我确实把它拿出来,它仍然在做同样的事情。在我的页面底部,它显示服务器消息,其中显示“确定文档已移到此处”,其中'here'是指向下一个cgi脚本的链接,当点击该链接时该脚本起作用。但是拿出'print $ cookie'并不会改变任何东西。 – Ybarra

0

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

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(您重定向到的URL)是错误的还是配置错误。

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

  1. 使用curl或类似的东西来做HTTP请求,并看到你得到正确的302响应。浏览器是一种很糟糕的方式来调试重定向问题,因为它们会掩盖实际正在发生的事情。

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