我可以使用以下代码通过我的Android应用程序登录http://yearbook08.com/:
String URL="http://yearbook08.com/login.php";
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = null;
HttpPost httppost = new HttpPost(URL);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("userId", uname));
nameValuePairs.add(new BasicNameValuePair("password", pass));
try {
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
现在,当我转移到另一个活动时,我想要检索http://yearbook08.com/wall.php但是网络服务器无法识别我的上一次登录并要求我再次登录。
登录后有没有办法让我保持登录状态?请帮助!
答案 0 :(得分:1)
您的代码未考虑会话管理。这种情况发生在成功登录后没有设置cookie,因此如果您发送另一个请求,初始身份验证将丢失,服务器将其视为新请求。 我建议你使用Apache httpcomponents库4.x(特别是httpclient)
创建一个httpcontext并将cookie商店附加为
// Create a local instance of cookie store
CookieStore cookieStore = new BasicCookieStore();
// Create local HTTP context
HttpContext localContext = new BasicHttpContext();
// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
HttpGet httpget = new HttpGet("http://www.google.com/");
// Pass local context as a parameter
HttpResponse response = httpclient.execute(httpget, localContext);
在后续请求中使用相同的localContext。另请注意,cookiestore和httpcontext应声明为静态或全局变量,因为只要您携带httprequest,它们的范围就必须存在。您不必自己设置cookie,它会自动完成! 并阅读有关HttpComponents 4.x http://hc.apache.org/httpcomponents-client-ga/index.html
的内容更新1: 确保它是v4和v3。 basicCookiestore自v4以来才出现。现在很清楚你使用的是不知道basiccookiestore对象的v3。将v4库添加到项目中。它将解决您的问题
更新2 如果您尝试从第二个活动中检索http://yearbook08.com/wall.php,则会出现此问题,因为第二个活动将不包含httpcontext,httpclient或Cookiestore对象。所以它会发送一个新的请求。 第一种方法 因此,您应该尝试在第一个活动本身中获取所需的内容,然后将获取的数据传递给第二个活动。这样你就可以保持会话。 第二次解决 如果您对此不满意,可以查看http://www.jameselsey.co.uk/blogs/techblog/android-implementing-global-state-share-data-between-activities-and-across-your-application/在活动中共享httpcontext,cookiestore和httpclient以完成任务。