来自Android应用和Java应用程序的不同HTTP响应

时间:2013-09-15 20:42:30

标签: java android http

我正在编写一个需要通过发送HTTP POST请求来验证服务器的Android应用程序。

当我在桌面上作为常规Java应用程序运行时,当用户名和密码有效时,我会收到200 OK响应代码,如果不是,则会收到302 Found(从浏览器输入无效的用户名/密码重定向到页面)说你是未经授权的。)

但是,从我的Android应用程序运行时,无论密码的有效性如何,我每次都会获得200 OK。

这是代码:

public static boolean authenticate(String user, String pass) {
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://website.com/login");

    try
    {
        // Add form parameters to request
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("basic", "true"));
        params.add(new BasicNameValuePair("j_username", user));
        params.add(new BasicNameValuePair ("j_password", pass));
        post.setEntity(new UrlEncodedFormEntity(params));


        // execute post request
        HttpResponse response = client.execute(post);
        int status = response.getStatusLine().getStatusCode();
        System.out.println("POST RESPONSE STATUS = " + status + ": " + response.getStatusLine().toString());

        // success if we get 200 OK
        // something went wrong if we get a 302 Found
        if (status == 200) {
            return true;
        } else if (status == 302) {
            return false;
        } else {
            System.out.println("Unknown response status: " + status);
            return false;
        }

    } 
    catch (IOException e) 
    {
        System.out.println("IOException trying to authenticate: " + e.getMessage());
    }

    return false;
}

使用netcat,我尝试将请求发送到我自己的计算机上以检查标题。

从桌面执行时,这就是发送内容:

kyle@kyle-Rev-1-0 ~ $ nc -l -p 8080
POST / HTTP/1.1
Content-Length: 51
Content-Type: application/x-www-form-urlencoded
Host: 192.168.2.17:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.3 (java 1.5)

basic=true&j_username=bob14&j_password=meow%21

在我的Android 4.1平板电脑上执行时,会发送:

kyle@kyle-Rev-1-0 ~ $ nc -l -p 8080
POST / HTTP/1.1
Content-Length: 51
Content-Type: application/x-www-form-urlencoded
Host: 192.168.2.17:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)

basic=true&j_username=bob14&j_password=meow%21

我认为它可能与用户代理有关,我尝试了一个空字符串以及“Apache-HttpClient / 4.2.3(java 1.5)”并且没有任何区别。

该项目在Eclipse中设置为使用库httpcore-4.2.2.jar和httpclient-4.2.3.jar。 Android项目目前还依赖于commons-httpclient-3.1.jar。

有没有人知道为什么请求会给我不同的回复?

1 个答案:

答案 0 :(得分:0)

当您通过https进行POST时,默认情况下Android HttpClient类不会重定向。

尝试不使用SSL进行测试。

Here's another related question