我正在制作一个需要登录网站的应用。为此,我创建一个HttpClient并对URL执行HttpPost。据我所知,这是有效的。 StatusCodes回馈200.在此之后,我执行HttpGet到受限制的URL(使用相同的客户端)。但是,我总是在LogCat中找回Forbidden Exception或登录屏幕。通过在网上搜索,我发现有时需要先在HttpPost之前对网站执行HttpGet,并附加CookieStore。做了两件事但仍然没有成功。有人在这里可以帮助我吗?
HttpClient client = new DefaultHttpClient();
HttpGet initiate = new HttpGet(url);
HttpPost post = new HttpPost(url);
HttpGet page = new HttpGet(restrictedurl);
HttpContext localContext = new BasicHttpContext();
CookieStore cookieStore = new BasicCookieStore();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse response = client.execute(initiate, localContext);
Log.i(Tag, " " + response.getStatusLine().getStatusCode());
response.getEntity().consumeContent();
response = client.execute(post, localContext);
Log.i(Tag, " " + response.getStatusLine().getStatusCode());
response.getEntity().consumeContent();
ResponseHandler<String> handler = new BasicResponseHandler();
String htmlpage = client.execute(page, handler, localContext);
Log.i(Tag, " " + response.getStatusLine().getStatusCode());
Log.i(Tag, htmlpage);
response.getEntity().consumeContent();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
这是我的LogCat:
06-06 13:38:47.033: I/LogTag (27839): StatusCode HttpGet: 200
06-06 13:38:47.197: I/LogTag (27839): StatusCode HttpPost: 200
06-06 13:38:47.361: W/System.err(27839): org.apache.http.client.HttpResponseException: Forbidden
06-06 13:38:47.377: W/System.err(27839): at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71)
06-06 13:38:47.384: W/System.err(27839): at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59)
06-06 13:38:47.384: W/System.err(27839): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657)
06-06 13:38:47.384: W/System.err(27839): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627)
06-06 13:38:47.384: W/System.err(27839): at com.dakro.wiebetaaltwat.MainActivity$AsyncPost.doInBackground(MainActivity.java:136)
06-06 13:38:47.384: W/System.err(27839): at com.dakro.wiebetaaltwat.MainActivity$AsyncPost.doInBackground(MainActivity.java:1)
06-06 13:38:47.392: W/System.err(27839): at android.os.AsyncTask$2.call(AsyncTask.java:264)
06-06 13:38:47.392: W/System.err(27839): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-06 13:38:47.392: W/System.err(27839): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-06 13:38:47.392: W/System.err(27839): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
06-06 13:38:47.392: W/System.err(27839): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-06 13:38:47.400: W/System.err(27839): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-06 13:38:47.400: W/System.err(27839): at java.lang.Thread.run(Thread.java:856)
答案 0 :(得分:1)
禁止错误通常表示您在Web服务器上访问的目录/文件存在权限问题。
检查所有者和组权限。还要检查文件上的写/读/执行标志。
您可以通过网络浏览器直接导航到网址,看看它是否也显示了禁止的消息?
答案 1 :(得分:1)
你可以使用这个条件
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
} else {
}
答案 2 :(得分:1)
甜蜜的成功!虽然我可以POST到URL并获得200 StatusCode,但它不是“完整”的URL。不得不为它添加index.php。表格数据也不完整。需要添加两个参数。
params.add(new BasicNameValuePair("action", "login"));
params.add(new BasicNameValuePair("login_submit", "Inloggen"));
通过检查网站发布到网站的表单数据来发现这一点。使用Chrome的开发人员工具(网络标签)中的内置版本。感谢您的回复!