对于作业,我建立一个以用户登录开始的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 );
然后没有任何作用,登录后,我的浏览器要么说找不到文件,要么试图下载脚本。
答案 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(您重定向到的那个)不正确或配置错误。
您可以运行几个简单的测试来证明它正常工作。
使用curl
或类似内容发出HTTP请求,并看到您获得了正确的302响应。浏览器是调试重定向问题的一种可怕方法,因为它们会不顾一切地隐藏实际情况。
尝试直接访问重定向网址。我怀疑你会遇到同样的问题,这将证明问题归结为URL,而不是你的重定向代码。