2

这是我正在尝试做的事情的描述:我想通过 HttpURLConnection 向网站发送登录表单。所以首先我向登录页面发送一个 GET 请求,以检查它是否存在以及我尚未登录。在关闭连接和输入流之后,我将参数设置为发送。然后我发出一个 POST 请求以实际登录。

编码:

url = new URL("http://www.example.com/login/");
con = (HttpURLConnection) url.openConnection();
in = con.getInputStream();
if(con.getResponseCode()==HttpURLConnection.HTTP_OK){
    loginData = getResponseData(in); // InputStream to String
    in.close();
    if(isBlank(loginData)){
        return StatusCode.CONNECTION_FAILED; // no login page
    }
    if (Login.getLoginStatus(loginData)) {
        return StatusCode.NO_ERROR; // already logged in
    }
}
con.disconnect();

String params = "password="+URLEncoder.encode(login.second,"UTF-8")+
        "&username="+URLEncoder.encode(login.first,"UTF-8");

url = new URL("http://www.example.com/login/login.php");
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setFixedLengthStreamingMode(params.getBytes().length);
out = con.getOutputStream();
out.write(params.getBytes());
out.close();
in = con.getInputStream(); \\ THIS IS WHERE IT GETS STUCK
if(con.getResponseCode()==HttpURLConnection.HTTP_OK){
    loginData = getResponseData(in);
    in.close();
    if(isBlank(loginData)){
        return StatusCode.CONNECTION_FAILED; // no login page
    }
    if (Login.getLoginStatus(loginData)) {
        return StatusCode.NO_ERROR; // logged in
    }   
    if (loginData.contains("Invalid username and//or password.")) {
        return StatusCode.WRONG_LOGIN_DATA; // wrong login
    }
}
con.disconnect();

在 2.3.x 版本中,它返回响应代码:302,InputStream 中没有数据(con.getInputStream()非常快),我可以在 Eclipse 调试模式下看到所有标题。

在 4.0.3 版本中,它返回响应代码:200,InputStream 中的所有数据(con.getInputStream()卡住了大约 2 分钟),在调试模式下我可以阅读以下内容:

con.ResponseCode = -1
con.ResponseMessage = null
con.redirectionCount = 1

你知道为什么会有差异,以及我如何设法让它在 2.3.x 及更高版本的每个版本中工作?

4

1 回答 1

3

在 4.0.3 中,重定向会自动为您处理(这就是为什么您甚至看不到 302 响应代码的原因)。

类上有一个getInstanceFollowRedirects 方法(或getFollowRedirects静态方法),HttpURLConnection您可以使用它来查看是否自动遵循重定向。使用它们对应的setter对应项(setInstanceFollowRedirects或 static setFollowRedirects),您可以更改此行为。

于 2012-07-27T14:48:51.987 回答