0

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

有没有一种方法可以让我在登录后保持登录状态?请帮忙!

4

1 回答 1

1

您的代码没有考虑会话管理。发生这种情况是因为在成功登录后没有设置 cookie,因此如果您发送另一个请求,初始身份验证将丢失,服务器会将其视为新请求。我建议你使用 Apache httpcomponents library 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 以完成任务。

于 2012-07-05T10:29:44.623 回答