通过302重定向维护会话和cookie

时间:2014-01-10 00:30:47

标签: ruby http ruby-2.0

我正在尝试获取一个PDF文件,该文件在auth墙后面按需生成。根据我的测试,流程如下:

我使用多个参数(包括身份验证凭据)向相应页面发出GET请求。该页面验证我的凭据,然后处理我的请求。当请求完成处理(几乎立即)时,我会收到一个302响应,将我重定向到生成的PDF的位置。然后,该PDF只能由该会话访问。

使用浏览器,真的没什么奇怪的。我尝试通过curlwget执行相同操作,但没有任何可选参数,但这些参数都失败了。我可以通过添加curl作为选项来获得-L -b /tmp/cookie.txt工作(但要遵循重定向和存储Cookie)。

According to the ruby-doc,使用Net::HTTP.start应该让我接近我想要的。在玩完之后,我确实非常接近。我认为唯一的问题是,我的Set-Cookie值在请求之间有所不同,即使它们在同一个http块中使用相同的start对象。

我尽量保持尽可能简单,然后在得到我想要的结果后扩展:

url = URI.parse("http://dev.example.com:8888/path/to/page.jsp?option1=test1&option2=test2&username=user1&password=password1")

Net::HTTP.start(url.host, url.port) do |http|
    # Request the first URL
    first_req = Net::HTTP::Get.new url
    first_res = http.request first_req

    # Grab the 302 redirect location (it will always be relative like "../servlet/sendfile/result/543675843657843965743895642865273847328.pdf")
    redirect_loc = URI.parse(first_res['Location']

    # Request the PDF
    second_req = Net::HTTP::Get.new redirect_loc
    second_res = http.request first_req
end

我还试图使用http.get而不是每次都创建一个新请求,但仍然没有运气。

1 个答案:

答案 0 :(得分:1)

问题在于cookie:它应该在第二个请求中传递。 Smth喜欢:

second_req = Net::HTTP::Get.new(uri.path, {'Cookie' => first_req['Set-Cookie']})