【问题标题】:How do I remain authenticated when accessing an URL directly with `get` in WWW::Mechanize?在 WWW::Mechanize 中使用 `get` 直接访问 URL 时,如何保持身份验证?
【发布时间】:2011-12-11 17:43:27
【问题描述】:

我是WWW::Mechanize 的新手,但我知道如何登录,然后知道如何在我登录时使用follow_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_link 方法进行导航,但是当我想使用get 方法访问不在页面上的 URL 时,我只是失去了身份验证。

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

【问题讨论】:

  • 如果你在浏览器中做同样的事情,它会起作用吗?该页面是否包含 URL (GET) 的一些信息?我能够登录到一个页面,然后直接导航到另一个页面,仍然处于登录状态。
  • @choroba :使用浏览器登录页面时,可以直接导航。但是当我在这里做同样的事情时,我失去了我的身份验证(我猜是 cookie 和会话)。我简直无法理解为什么我什么时候可以使用 follow_link 而不是 get,因为 follow_link 基本上是通过分析 Mechanize 的源代码得到的命令。
  • 用 & 替换 & 怎么样?在网址中?

标签: perl authentication mechanize


【解决方案1】:

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

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

    $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
    

    【讨论】:

    • get 在相对 URL 上可以正常工作,只要堆栈中已经有一个页面可以提供基础。
    • 我以前没有意识到这一点。我写的所有东西都有绝对的uris。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多