【问题标题】:Different HTTP response from Android app and Java application来自 Android 应用程序和 Java 应用程序的不同 HTTP 响应
【发布时间】:2013-09-16 05:09:55
【问题描述】:

我正在编写一个需要通过发送 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。

有人知道为什么这些请求会得到不同的响应吗?

【问题讨论】:

  • 一定有你没有向我们展示的东西。 User-Agent 真的不应该影响请求。
  • 使用类似 Firefox Live HTTP Headers 插件并记录两种情况下的桌面请求响应 - 正确和错误的密码。将其与平板电脑的请求/响应进行比较。也可能是目标网站将请求从您的应用用户代理重定向到移动网站,或者网站本身对您的应用的移动用户代理给出不同的响应。从应用程序中尝试桌面用户代理是另一个想法。

标签: java android http


【解决方案1】:

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

出于测试目的尝试不使用 SSL。

Here's another related question

【讨论】:

  • 实际上问题是 HttpClient 在 Android 上默认遵循重定向。很好的链接,我可以通过添加以下行来解决我的问题:HttpClientParams.setRedirecting(post.getParams(), false);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 2011-07-13
  • 2011-09-08
  • 1970-01-01
相关资源
最近更新 更多