You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android WebView应用中配置Cookie实现30天持久登录

解决WebView Cookie持久化问题,实现30天自动登录

我来帮你搞定这个问题!你的点餐网站已经设置了Cookie有效期30天,但WebView默认不会自动把Cookie持久化到磁盘,导致关闭APP后Cookie丢失,用户需要重新登录。只需要在你的MainActivity.java中添加几处Cookie管理的配置即可,具体修改如下:

修改后的完整代码

package com.eatlaza;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

    WebView webView;
    ProgressBar progressBarWeb;

    RelativeLayout relativeLayout;
    Button btnNoConnection;

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

        webView = (WebView) findViewById(R.id.myWebView);
        progressBarWeb = (ProgressBar) findViewById(R.id.progressBar);
        btnNoConnection = (Button) findViewById(R.id.btnNoConnection);
        relativeLayout = (RelativeLayout) findViewById(R.id.relativelayoiut);

        // --- 新增Cookie持久化配置开始 ---
        CookieManager cookieManager = CookieManager.getInstance();
        // 启用WebView接受服务器发送的Cookie
        cookieManager.setAcceptCookie(true);
        // Android 5.0及以上需要开启第三方Cookie支持(如果网站依赖第三方服务)
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            cookieManager.setAcceptThirdPartyCookies(webView, true);
        }
        // --- 新增Cookie持久化配置结束 ---

        //javascript enable
        webView.getSettings().setJavaScriptEnabled(true);
        checkInternetConnection();


        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                progressBarWeb.setVisibility(View.VISIBLE);
                progressBarWeb.setProgress(newProgress);
                if (newProgress == 100) {
                    progressBarWeb.setVisibility(View.GONE);
                }

                super.onProgressChanged(view, newProgress);
            }
        });
        //retry
        btnNoConnection.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkInternetConnection();
            }
        });
    }

    // --- 新增:APP暂停时强制同步Cookie到磁盘 ---
    @Override
    protected void onPause() {
        super.onPause();
        CookieManager.getInstance().flush();
    }

    @Override
    public void onBackPressed() {
        if (webView.canGoBack()) {
            webView.goBack();
        } else {
            AlertDialog alertDialog = new AlertDialog.Builder(this)
//set message
                    .setMessage("Are You Sure You want to close it?")
//set positive button
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            //set what would happen when positive button is clicked
                            finish();
                        }
                    })
//set negative button
                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            //set what should happen when negative button is clicked
                            // Toast.makeText(getApplicationContext(),"Nothing Happened",Toast.LENGTH_LONG).show();
                        }
                    })
                    .show();
            //super.onBackPressed();
        }
    }
    //class for check internet connection
    public void checkInternetConnection() {
        ConnectivityManager connectivityManager = (ConnectivityManager)
                this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo mobileNetwork = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        String webUrl = "https://eatlaza.com";
        if (wifi != null && wifi.isConnected()) {
            webView.loadUrl(webUrl);
            webView.setVisibility(View.VISIBLE);
            relativeLayout.setVisibility(View.GONE);
        } else if (mobileNetwork != null && mobileNetwork.isConnected()) {
            webView.loadUrl(webUrl);
            webView.setVisibility(View.VISIBLE);
            relativeLayout.setVisibility(View.GONE);
        } else {
            webView.setVisibility(View.GONE);
            relativeLayout.setVisibility(View.VISIBLE);
        }
    }
}

关键修改说明

  • 启用Cookie接受:cookieManager.setAcceptCookie(true) 确保WebView能够接收服务器发送的Cookie,这是持久化的基础
  • 第三方Cookie支持:Android 5.0(API 21)及以上系统默认禁用第三方Cookie,如果你的网站使用了支付、统计类第三方服务,必须开启这个配置才能让相关Cookie正常保存
  • 强制同步Cookie到磁盘:重写onPause方法并调用CookieManager.getInstance().flush(),这个方法会把内存中的Cookie立即写入磁盘,避免APP关闭后Cookie丢失
  • 空指针防护:在checkInternetConnection中给wifi和mobileNetwork添加了null判断,避免不同系统版本下可能出现的崩溃问题

这样配置后,WebView就会持久化保存服务器发送的30天有效期Cookie,用户关闭APP再打开时就能直接保持登录状态了。

内容的提问来源于stack exchange,提问作者BM Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:25:45