AndroidでのCookie保存メカニズムの問題

2497 ワード

プロジェクトでは永続化されたログインが使用されています.つまり、最初のログイン後にCookieをローカルに保存し、次にアプリケーションにアクセスするときにログイン操作を免除することができます(この項目はReact Naitveが支援します.サーバがSet-Cookie応答ヘッダを設定すれば、Cookieが失効する時間はサーバが決定します).アプリケーションのロジックは、アプリケーションを初めて使用するときにログインする必要があり、ログインに成功した後、バックエンドはローカルでCookieを栽培し、次回アプリケーションを開くときにログインする必要はなく、インタフェースを要求するたびにCookieを持参し、バックエンドチェックはCookieが失効すると要求をAuthFailedにリダイレクトし、要求がAuthFailedにリダイレクトされると、ログインインタフェースにジャンプして再ログインする必要がある.これまで、この機能は安定して調和のとれた動作をしていましたが、ある日、上陸後すぐにアプリケーションを終了すると、どのような体験になるのでしょうか.これからは帰らない道に向かいましたが...ログイン後すぐにアプリケーションを終了し、次にアプリケーションにアクセスするとログインページにジャンプすることに気づきました(アプリケーション機能が起動するとCookieが有効かどうかを検証し、失効するとログインページにジャンプします).これは理解できません.実は最初はAndroidの下でCookieの保存メカニズムの問題であることに気づいていませんでした.それまでに新しい機能を追加したので、自然と新しい機能によるバグだと思いましたが、バグが何によって引き起こされたのか分かりませんでした.その後、CommitとCommitのロールバック検証を行い、前の安定したバージョンに戻るまで、この問題が発生しました.私はバックエンドインタフェースの問題だと疑い始め、バッグの分析を始めました.要求の頭の中にCookieが付いていないことがあります.IOSの下にはこの問題はありません.アンドロイドの下でCookieを正常に保存できないのではないかと思っていました.この考えに基づいて、私は以下の試みをしました.
  • react-native-cookiesを使用してログイン成功後にCookie
  • を手動で設定
  • fetchの要求ヘッダを設けるcredentials項はinclude又はsame-origin
  • である.
    また,大量の検索,Issueの表示なども行い,いずれも失敗した.Androidのクッキー保存メカニズムの問題かもしれないという記事が偶然見つかりました.
    Synchronize the browser cookie store between RAM and permanent storage. To get the best performance, browser cookies are saved in RAM. A separate thread saves the cookies between, driven by a timer. … The sync interval is 5 minutes, so you will want to force syncs manually anyway.
    記事はここにリンクされています.つまり、私がログインに成功した後、すぐにアプリケーションを終了すると、Android側はCookieを保存するのに間に合わない可能性があり、次のログイン時に永続化が失効する可能性があります.本文のソリューションに従ってMainActivity.javaファイルを修正し、前の変態操作を再度実行すればよい.次に、新しい構成コード(原文にインポートされていない2つのパッケージが追加されました)を示します.
    // Handle Cookies
    import android.webkit.CookieSyncManager;
    import android.os.Build;
    import android.webkit.CookieManager;
    
    public class MainActivity extends ReactActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            initCookie();
        }
    
        @Override
        protected void onStop() {
            saveCookie();
            super.onStop();
        }
    
        private void initCookie() {
            if (Build.VERSION.SDK_INT < 21) CookieSyncManager.createInstance(this);
        }
        private void saveCookie() {
            if (Build.VERSION.SDK_INT >= 21) CookieManager.getInstance().flush();
            else CookieSyncManager.getInstance().sync();
        }
    }
    
    本当に突っ込む力がなくて、心身ともに苦労して......
    終わります.