使用URI.pm进行Perl CGI重定向

时间:2013-06-07 18:03:58

标签: perl redirect cgi uri

我有一个Perl脚本,在某些情况下需要重定向到另一个脚本并发送所有查询参数。查询参数可以包含大量数据,我不想构造和附加一个看起来很乱的POST字符串。基于一些研究,我得出了这个:

use strict;
use warnings;
use CGI;
use URI;

my $query = CGI->new();
my %lots_of_data = $query->Vars;

my $uri = URI->new('http://whatever.com/new_script.pl');
$uri->query_form(\%lots_of_data);

print $query->redirect(-location => $uri);

问题:

  1. 那会有用吗?
  2. 我是否需要使用-nph或-status参数进行重定向?
  3. new_script.pl如何使用发送给它的数据填充自己的CGI查询对象,或者数据是否神奇地最终出现在查询对象中?
  4. 非常感谢!

3 个答案:

答案 0 :(得分:1)

由于您可以控制两个脚本,因此可以使用会话。会话是服务器在本地存储客户端特定信息的任何系统,以便在为同一客户端的后续请求提供服务时进行访问。为了确定两个请求来自同一客户端,服务器向客户端提供客户端将在未来请求中提供服务器的标识符。 Cookie通常用于传输标识符,但也可以使用单个“表单”参数。

例如,如果两个脚本都可以访问同一个数据库,则可以将参数与id [1] 一起存储在数据库中,并将其从一个脚本传递到另一个脚本通过cookie(如果两个脚本在同一个域上)或通过参数

new_script.pl?sid=?????

我会让你研究实施细节。 CGI::Session可能有用。


  1. 您不希望任何人猜测任何人的会话ID,因此您不能只使用递增的行ID作为会话ID。不过,你可以使用一个盐渍哈希。

答案 1 :(得分:1)

感谢所有想法。我决定序列化参数,然后仅使用文件名重定向到第二个脚本。

my %queryParams = $q->Vars;
my $pid = $$;
my $serializedFile = $tmpDir . "qs". $pid . ".ser";    # /tmp/qs1234.ser

nstore(\%queryParams, $serializedFile);

my $url = $cgiRoot."/cluster/drpSelectGenes.pl?pid=$pid";
print $q->redirect($url);
exit(0);

在接收端:

if ($q->param("pid")) {

    my $serializedFile = $tmpDir . "qs" . $q->param('pid') . ".ser";;
    my %params = %{Storable::retrieve($serializedFile)};

    # move the values into the query object.  (Is there a better way?)
    foreach my $key (keys %params) {
        my $val = $params{$key};
        if ($key eq "fullID") {   # convert null-delimited list into an array
            my @arr = split "\0", $val;     
            $q->param(-name => 'fullID', -values => \@arr);
        } else {
            $q->param(-name => $key, -values => $val);
        }
    }
}

P.S。对于ikegami来说,这个应用程序确实使用了会话,但是将它们与我希望避开的数据库紧密联系起来。

答案 2 :(得分:0)

如果你需要保密参数,那么使用POST,如果你通过get得到它们,那么只需使用URI将查询参数重新链接到URL上。

您可能不需要使用URI,您可能只能将$ URI连接到$ QUERY_STRING环境变量。

如果你需要POST,那么你最终不应该有很多混乱的代码。你已经将所有参数都作为哈希。您应该只能传递散列并将其插入到POST参数中。

如果您可以使用GET,那么重定向将起作用。如果您需要发帖,那么WWW::MechanizeHTTP::TinyLWP就是您的朋友。