Perl 在WWW::Mechanize中使用“get”直接访问URL时,如何保持身份验证?

Perl 在WWW::Mechanize中使用“get”直接访问URL时,如何保持身份验证?,perl,authentication,mechanize,Perl,Authentication,Mechanize,我是新手,但我知道如何登录,以及如何在登录时使用follow\u link方法访问其他页面。但是,当我想直接访问不在页面上的链接时,我会丢失身份验证 问题的快速示例: my $LoginURL = "http://www.website.com/user/login.jsp?"; my $DirectURL= "/Somefile?param1&param2"; $mech = WWW::Mechanize->new(); $mech->get($LoginURL); $me

我是新手,但我知道如何登录,以及如何在登录时使用
follow\u link
方法访问其他页面。但是,当我想直接访问不在页面上的链接时,我会丢失身份验证

问题的快速示例:

my $LoginURL = "http://www.website.com/user/login.jsp?";
my $DirectURL= "/Somefile?param1&param2";
$mech = WWW::Mechanize->new();
$mech->get($LoginURL);
$mech->submit_form( ... ); # fields and stuff, works fine.
$mech->get($DirectURL);    # This part fails and I'm using the direct URL.
我了解如何登录,并且可以使用
follow\u link
方法进行导航,但是当我想使用
get
方法访问不在页面上的URL时,我就失去了身份验证

当我想访问不在当前页面上的直接URL时,我必须做什么才能保持身份验证?

$mech->get()是LWP::UserAgent的重载。它需要绝对URL

my $uri = $mech->uri();           # Get the current URI
my $uri->path_query($DirectURL);  # Replace the path with file path
$mech->get($uri->as_string);      # Returns http://www.website.com/Somefile?param1&param2

由于HTTP是无状态协议,因此每个请求都独立于前一个请求。在HTTP 1.1之前的版本中,HTTP事务的默认行为是客户端联系服务器、发送请求并接收响应,然后客户端和服务器断开TCP连接。如果客户端需要服务器上的另一个资源,它必须重新建立另一个TCP连接,请求该资源,然后断开连接。如果您已成功通过身份验证,目标网站可能会在您尝试访问下一页时“忘记”。尝试查看HTTP“连接”头中包含的值。它应该是“保持活力”,而不是“关闭”。如果这是问题所在,请尝试修改“连接”标题。您可以尝试以下方法:

  $mech->add_header(
  "Connection" => "keep-alive",
  "Keep-Alive" => "115");

希望有帮助。

如果你在浏览器中也这样做,它会起作用吗?页面是否在URL(GET)中包含一些信息?我可以登录到一个页面,然后直接导航到另一个页面,但仍在登录。@choroba:当使用浏览器登录该页面时,可以直接导航。但当我在这里做同样的事情时,我会丢失身份验证(我猜是cookie和会话)。我简直不明白为什么我可以使用follow_链接而不是get,因为follow_链接基本上是一个get命令,通过分析Mechanize的源代码。替换&by&;在URL中?
get
可以很好地处理相对URL,只要堆栈中已经有一个页面可以提供基础。我以前没有意识到这一点。我写的所有东西都有绝对URI。