0

我有一个 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 回答 3

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

PS 到 ikegami,这个应用程序确实使用了会话,但它们与我希望避开的数据库密切相关。

于 2013-06-10T18:44:32.810 回答
1

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

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

new_script.pl?sid=?????

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


  1. 您不希望任何人猜测任何人的会话 ID,因此您不能只使用递增的行 ID 作为会话 ID。不过,您可以使用其中的盐渍哈希。
于 2013-06-10T17:34:19.060 回答
0

如果您需要对参数保密,则使用 POST,如果您通过 get 获取它们,则只需使用 URI 将查询参数返回到 URL。

您可能不需要使用 URI,您可能只需将新的 URI 与 $QUERY_STRING 环境变量连接起来。

如果你需要 POST,那么你不应该得到很多乱七八糟的代码。您已经将所有参数作为哈希值。您应该能够传递散列并将其插入到 POST 参数中。

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

于 2013-06-07T19:15:36.950 回答