我正在使用 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();
}
}
长时间(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()
}
我们有可重现的用例:
当用户不终止应用程序并使用后退按钮关闭它时,一切都会按预期工作。
看起来,
onPause
中的刷新在存储之前就被杀死了。但是,当我们在每次页面加载后调用它时,为什么它不能正常工作呢?不知道...它有很多时间来保存cookie。