2016-02-27 135 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,而不是你的重定向代碼。