Android 异步 Http 客户端 (loopj) 和持久性 Cookie 存储

标签 android http cookies android-asynctask

我是 Android 开发新手。关于使上述库以最佳方式工作的最佳方法有几个问题。

目前,我的应用程序中有三个 Activity 。 MainActivity、LoginActivity 和 HomeActivity。该应用程序启动 MainActivity,它应该检查此人是否已登录。如果此人已登录,则重定向到主页,否则重定向到登录。

documentation 中所述,我创建了一个 RestClient 类。我可以在我的 LoginActivity 中成功发出请求并获得响应。这是我的登录代码。

public void login() {
        RequestParams params = new RequestParams();
        params.put(AUTH_PARAMETER_EMAIL, mEmail);
        params.put(AUTH_PARAMETER_PASSWORD, mPassword);

        RestClient.setCookieStore(new PersistentCookieStore(this));
        RestClient.post(AUTH_URL, params, new JsonHttpResponseHandler() {
            @Override
            public void onFinish() {
                showProgress(false);
            }

            @Override
            public void onSuccess(JSONObject response) {
                String response_status = null;
                try {
                    response_status = response.getString(AUTH_RESPONSE_STATUS);
                } catch (JSONException e) {
                    Toast.makeText(LoginActivity.this,
                            "ERROR: " + e.toString(), Toast.LENGTH_LONG).show();
                    Log.e(TAG, e.toString());
                }
                if (response_status.equals(AUTH_SUCCESS_STATUS)) {
                    finish();
                } else {
                    mPasswordView
                            .setError(getString(R.string.error_incorrect_password));
                    mPasswordView.requestFocus();
                }
            }

            @Override
            public void onFailure(Throwable e, String content) {
                Toast.makeText(LoginActivity.this, "ERROR: " + e.toString(),
                        Toast.LENGTH_LONG).show();
                Log.e(TAG, e.toString());
            }

        });
    }

问题

  1. 这将在每次请求时创建一个新的 cookie 存储 制成。我应该把它放在哪里以便只创建一次?应该 我把它放在 MainActivity 的 onCreate 中,然后将它分配给一个 全局变量?这是最佳做法吗?
  2. 在我的 MainActivity 中,如何检查已创建的 session cookie 从服务器发送?我知道这是共享偏好,但如何 我能得到它吗?文档没有说明它将是什么变量 存储在 SharedPreferences 中。
  3. 当我需要注销某人时,我是删除共享首选项还是 删除cookie存储或两者?它们是否自动保持同步?
  4. 当应用程序重新启动时,我如何从共享首选项中保存的数据初始化 cookie 存储?
  5. 如果您知道任何正确实现此功能的开源代码,我很乐意查看并亲自回答这些问题。只需提供一个链接!

最佳答案

所以这是我到目前为止所做的。它有效,但我不确定这是否是最佳实践。

1) cookie 存储从 sharedpreference 初始化。因此,只需在每次需要时创建一个新的即可。确保每次都使用相同的上下文。我正在使用 getApplicationContext()

2) 和 4) 曲奇店为您代劳。只需创建一个与您之前创建的上下文相同的新上下文。只要您保持一致,cookie 就会正确初始化。

3) cookie 存储保持共享首选项及其本地属性同步,因此只需调用 (new PersistentCookieStore(getApplicationContext())).clear();

我的代码

RestClient.java

public static void setCookieStore(PersistentCookieStore cookieStore) {
    client.setCookieStore(cookieStore);
}

登录 Activity .java

RestClient.setCookieStore(new PersistentCookieStore(getApplicationContext()));

主 Activity .java

private void loginRouter() {
    PersistentCookieStore mCookieStore = new PersistentCookieStore(
            getApplicationContext());
    List<Cookie> cookies = mCookieStore.getCookies();
    for (Cookie c : cookies) {
        if (c.getName().equals("session")) {
            startActivity(new Intent(this, HomeActivity.class));
            finish();
        }
    }
    launchSplashPage();
}

关于Android 异步 Http 客户端 (loopj) 和持久性 Cookie 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16647287/

相关文章:

android - 如何使用字符串作为代码?

java - 这段 Java 代码仍然安全吗?使用 URL 类的 HTTPS 连接

php - 追踪流量来源

android - Gradle DSL 方法未找到 : 'kapt()'

android - 更改 TimePicker watch 内指针的颜色。 Material 设计?

android - Unresolved reference : android build failed with kotlin dsl (reproducible in an empty project)

php - 使用 MySQL 和 PHP 返回单个值

php - GET over POST 对生产有什么好处吗?

facebook - fbm & fbsr cookies 和 cookieless 子域

java - 无法从 Java 中的 cookie 获取值。值包含逗号。