我正在编写一个需要通过发送 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。
有谁知道为什么这些请求让我得到不同的回应?