在应用程序生命周期中保持登录网站

时间:2012-07-05 10:04:40

标签: android

我可以使用以下代码通过我的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但是网络服务器无法识别我的上一次登录并要求我再次登录。

登录后有没有办法让我保持登录状态?请帮助!

1 个答案:

答案 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以完成任务。