Android HTTP GET cookie / javascript issue?

Android HTTP GET cookie / javascript issue?

本文关键字:javascript issue cookie HTTP GET Android      更新时间:2023-09-26

我写了一个Android应用程序,应该使用HTTP GET(有时还有POST)请求"连接"到(私人)论坛。基本思想是这样的:

  1. 用户提交凭据的登录页。登录是通过对论坛的登录页面执行HTTPPOST(也尝试了GET,结果相同)来执行的,参数是他们的用户名和密码。请求应该返回我存储在BasicCookieStore中的一些cookie。

  2. 他们想要访问的论坛的每个页面都使用HTTPGET进行检索。我解析我获得的HTML源代码,并只向他们显示相关信息。为了验证用户,将我用于登录(步骤1)的BasicCookieStore设置为HttpClient的cookiestore。

这种方法在我的测试过程中一直有效,对我的测试版测试人员也有效。现在我发布了这个应用程序,很明显,许多用户都有问题,尤其是在移动连接上(Wifi似乎没有问题)。

通过记录所有HTTPGET请求中返回的HTML源代码,我强烈怀疑实际登录运行良好,但不知何故,cookie不会被返回或存储,或者朝着这个方向。问题是,他们将收到的第一个页面的HTML源应该是论坛列表。但是,如果用户有问题,他们会收到一个页面,上面基本上写着"您必须启用Javascript才能查看此页面"

奇怪的是,我在测试时没有收到那个页面,我的许多用户也没有。更糟糕的是:一些用户现在报告说,它在几天或几周内都很好,现在已经停止工作。其他人则恰恰相反:几天不工作,突然就工作了。一位用户报告说,他在希腊呆了两周,在那里它完美地工作了,然后他回到德国,它又停止了工作。这里似乎有一个随机因素在起作用。

我尝试了各种方法,主要是通过处理HTTPGET请求的方式。我开始使用普通的DefaultHttpClient,有各种设置,比如:

HttpClient httpClient = new DefaultHttpClient();
// Define parameters
HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT); 
HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
// Set cookiestore (getCookieStore returns the same cookiestore)
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, getCookieStore());
HttpGet http = new HttpGet(url);
http.addHeader("Accept", ACCEPT_STRING);
http.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
// Execute
HttpResponse response = httpClient.execute(http, localContext);
//... Process result (omitted)

现在我改为使用AndroidHttpClient,其余代码基本上没有变化,似乎得到了相同的结果。

我还尝试过使用AsyncHttpClient库,它的工作方式完全不同,但结果再次相同。我也试过使用它的PersistentCookieStore,你们猜到了——结果是一样的。

在这一点上我一无所知。我看错方向了吗?事实上,一个网站会对一些用户回复"你需要启用Javascript",而不是对所有用户回复,这似乎表明cookie存在问题。我不知道网站是如何确定是否启用了javascript的,但对于HTTPGET请求,肯定没有javascript在起作用。那么,为什么我(和许多其他用户)可以毫无问题地访问页面,而其他用户却收到"无javascript"消息呢?我唯一能想到的原因是饼干,但我不知道到底是什么问题。

任何帮助都将不胜感激!

我怀疑问题出在cookie上。更有可能是网络配置问题。

例如,你的用户可能已经通过一个专属门户页面连接到了一个wifi热点(该页面使用javascript让你在使用热点之前登录)。在这种情况下,他们应该首先打开浏览器,尝试浏览到(例如)http://google.com,获得重定向,登录并,然后启动您的应用程序。

或者,您的用户可能正在通过代理进行连接。世界各地的许多移动运营商都会代理用户的HTTP连接,有时会对内容做出可怕的事情。切换到HTTPS可能会有所帮助。