Android Webview:登录cookie不断被删除

问题描述 投票:0回答:1

我正在使用 Java 中的 Android Webview 在节点服务器上加载网页。

我的节点服务器要求我登录。之后,它使用访问令牌创建一个 httpOnly cookie 并将其发送回来,然后我将其手动存储在 Android 上的 Java 中。

某些原因导致我的 cookie 被破坏或丢失,导致我必须不断重新登录,但这是随机的。有时它会保持登录状态,有时我会恢复应用程序,它会切换到登录页面。

cookie 也不会过期。我把它设置为30天过期。它在浏览器上也运行得很好。它只是......随机地从我的手机中自动删除。

我也在手动保存和加载 cookie,怎么会这样呢?

我应该在登录页面完成后才保存它吗?我是否在错误的时间冲水?

    public class MainActivity extends AppCompatActivity {

    private WebView webView;

    private String websiteDomain = "https://10.0.4.12";

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Initialize WebView

        webView = findViewById(R.id.webView);
        webView.setWebContentsDebuggingEnabled(true);
        WebSettings webSettings = webView.getSettings();
        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);

        if (Build.VERSION.SDK_INT >= 21) {
            CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
        } else {
            CookieManager.getInstance().setAcceptCookie(true);
        }

        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);

        loadCookiesFromSharedPreferences();

        // Set WebViewClient to handle redirects and other events
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) {
                handler.proceed(); // Ignore SSL certificate errors
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                saveCookiesToSharedPreferences(url);
                printCookies(url);
            }

        });

        // When we first start the webview, load the route that takes us to the last page we were on previously
        webView.loadUrl(websiteDomain + "/auth/last");
    }

    // Save cookie retrieved from webview manually to shared preferences
    private void saveCookiesToSharedPreferences(String url) {
        CookieManager cookieManager = CookieManager.getInstance();
        String cookies = cookieManager.getCookie(url);

        // Save cookies to shared preferences
        SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("saved_cookies", cookies);
        editor.apply();
    }

    // Load cookie retrieved from webview manually from shared preferences into the cookie manager
    private void loadCookiesFromSharedPreferences() {
        // Load cookies from shared preferences
        SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE);
        String cookies = preferences.getString("saved_cookies", "");

        // Set cookies in CookieManager
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setCookie(websiteDomain, cookies);
    }

    // Print the cookie for debugging
    private void printCookies(String url) {
        Log.d("COOKIE", "Has cookies: " + String.valueOf(CookieManager.getInstance().hasCookies()) );
        String currentCookie = CookieManager.getInstance().getCookie(url);
        Log.d("COOKIE", "Current cookie in webView:" + currentCookie);
    }

    @Override
    protected void onPause() {
        super.onPause();
        CookieManager.getInstance().flush();
        webView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        loadCookiesFromSharedPreferences();
        webView.onResume();
    }
}
android cookies webview jwt android-cookiemanager
1个回答
0
投票

长时间(4年)遇到同样的问题而没有正确解决:(。 每个页面加载完成后我都会打电话给

CookieManager.getInstance().flush()

binding.mainWebView.webViewClient = object : WebViewClient() {
            override fun onPageFinished(
                view: WebView,
                url: String,
            ) {
                super.onPageFinished(view, url)
                // Store cookies after every page load, to be sure, that we store login cookies...
                CookieManager.getInstance().flush()
            }

以及片段上的

onPuase
,但没有任何帮助。

    override fun onPause() {
        CookieManager.getInstance().flush()
        super.onPause()
    }

我们有可重现的用例:

  • 用户打开应用程序并登录到 webview 应用程序
  • 用户使用“HW”按钮查看任务列表并杀死应用程序
  • 用户打开应用程序
  • 用户位于登录页面而不是已登录

当用户不终止应用程序并使用后退按钮关闭它时,一切都会按预期工作。

看起来,

onPause
中的刷新在存储之前就被杀死了。但是,当我们在每次页面加载后调用它时,为什么它不能正常工作呢?不知道...它有很多时间来保存cookie。

© www.soinside.com 2019 - 2024. All rights reserved.