如何在Android 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
相关产品推荐
相关产品推荐

