7

我已经搜索了一段时间,但没有找到明确的答案。我正在尝试登录网站。 https://hrlink.healthnet.com/ 该网站重定向到一个不一致的登录页面。我必须将我的登录凭据发布到重定向的 URL。

我正在尝试用 Java 编写代码,但我不明白如何从响应中获取 URL。它可能看起来有点乱,但我在测试时就是这样。

    HttpGet httpget = new HttpGet("https://hrlink.healthnet.com/");
    HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();

    String redirectURL = "";

    for(org.apache.http.Header header : response.getHeaders("Location")) {
        redirectURL += "Location: " + header.getValue()) + "\r\n";
        }        

    InputStream is;
    is = entity.getContent();

    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
            sb.append(line + "\n"); 
    } 
    is.close(); 

    String result = sb.toString();

我知道我被重定向了,因为我的结果字符串显示为实际的登录页面,但我无法获得新的 URL。

在 FireFox 中,我使用 TamperData。当我导航到此网站https://hrlink.healthnet.com/时,我有一个带有 302 - Found 和登录页面位置的 GET。然后另一个 GET 到实际的登录页面

非常感谢您的任何帮助。

4

1 回答 1

9

查看w3c 文档

10.3.3 302 找到

临时 URI 应该由响应中的 Location 字段给出。除非请求方法是 HEAD,否则响应的实体应该包含一个简短的超文本注释,其中包含指向新 URI 的超链接。

如果收到 302 状态码以响应 GET 或 HEAD 以外的请求,除非用户可以确认,否则用户代理不得自动重定向请求,因为这可能会改变发出请求的条件。

一种解决方案是使用 POST 方法在客户端中断自动重定向:

HttpPost request1 = new HttpPost("https://hrlink.healthnet.com/");
HttpResponse response1 = httpclient.execute(request1);

// expect a 302 response.
if (response1.getStatusLine().getStatusCode() == 302) {
  String redirectURL = response1.getFirstHeader("Location").getValue();
  
  // no auto-redirecting at client side, need manual send the request.
  HttpGet request2 = new HttpGet(redirectURL);
  HttpResponse response2 = httpclient.execute(request2);

  ... ...
}

希望这可以帮助。

于 2012-04-26T22:20:32.567 回答