【问题标题】:WebView not accepting some cookiesWebView 不接受某些 cookie
【发布时间】:2019-03-12 04:00:32
【问题描述】:

我正在 Webview 中加载一个网站,该网站使用一些 cookie 来存储会话。我写了以下几行来接受 cookie

CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().setAcceptCookie(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    CookieManager.setAcceptFileSchemeCookies(true);
    CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
}
webView.loadUrl("https://www.irctc.co.in/nget/train-search");

在某个阶段(从支付网关付款后),shouldOverrideUrlLoading 方法被调用,之后它应该登陆到交易成功页面,但它继续进入登录页面。这是我的方法:

@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    Log.d(TAG, "The URL is loaded in webview itself");
    return false;
}

使用 Chrome 开发者工具,我可以看到以下网站 cookie

当我调用方法 CookieManager.getInstance().getCookie(url) 时,我可以看到 cookie JESESSIONIDSLB_Cookie 存在于 webview 中,但不确定 本地存储强>饼干。此外,如果我在 Chrome 中删除 本地存储 cookie,我将获得完全相同的页面(登录页面),而不是像 WebView 这样的事务成功页面。所以我想如果我通过任何方式检查本地存储cookie是否存在于webview中,如果不存在那么如果我添加它,我的工作就完成了。但我无法完成任何一项任务。

【问题讨论】:

  • 你想将登录对象传递给 webview 中 url 上的 cookie 吗?
  • 我只希望打开的最终页面应该是交易成功页面,而不是登录页面。 (我认为)是该网站的本地存储 cookie 未在 webview 中加载的原因,所以我希望加载它。或者,如果存在其他问题的替代方案(或原因),我想知道。
  • 您必须弄清楚该站点如何接受 cookie,并且您必须像我在下面回答的那样传递它
  • 嗨,维沙尔。请不要在此处添加闲聊材料。你已经研究过这个问题是理所当然的,你不需要说明它。你被卡了多久可能无关紧要,通常只是为了乞求和恳求而添加到帖子中。我们更喜欢不添加感谢和其他细节 - 我们更喜欢在这里进行技术写作,并且经常指出 Stack Overflow 不是聊天室。
  • 作为参考,我有时会在 cmets 中添加以下建议:请注意,我们更喜欢这里的技术写作风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,聊天材料和缩写 txtspk,恳求,你多久了被卡住、投票建议、元评论等。只需解释您的问题,并展示您尝试过的内容、预期的内容以及实际发生的情况。

标签: android cookies webview android-webview session-cookies


【解决方案1】:

如果您想将您的登录用户数据传递给 Webview 中的 cookie,请这样做 前几天我不得不将我的登录对象传递给特定的 URL 如下。

            WebSettings settings = webViewRoi.getSettings();
            settings.setDomStorageEnabled(true);
            settings.setJavaScriptEnabled(true);
            settings.setJavaScriptCanOpenWindowsAutomatically(false);
            settings.setAppCacheEnabled(true);
            settings.setAllowUniversalAccessFromFileURLs(true);
            settings.setAllowFileAccessFromFileURLs(true);

            Gson gson = new GsonBuilder().disableHtmlEscaping().create();


            FormsDTO formsDTO = new FormsDTO();
            FormsDTOProfile dtoProfile = new FormsDTOProfile(LoginActivity.loginInfoDTO.getProfile());
            formsDTO.setProfile(dtoProfile);
            formsDTO.setAuthorized(true);
            formsDTO.setToken(LoginActivity.loginInfoDTO.getToken());

            String out123 = gson.toJson(formsDTO);

            String auth2 = URLEncoder.encode(out123, "UTF-8");

            String z = "userInfo=" + auth2;  // here userinfo is the key of cookie
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptCookie(true);


            cookieManager.setCookie(url, z);
            webViewRoi.setWebChromeClient(new WebChromeClient());
            webViewRoi.loadUrl(url);

因此,如果您知道 cookie 的键名,那么您可以通过 cookie 传递您的登录对象。希望对你有帮助。

【讨论】:

  • 这是我的对象,您也可以忽略它并将您的令牌传递给序列化形式
  • 非常感谢... CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.setCookie(url, z);为我完成了这项工作......我之前也尝试过 setCookie 方法,但我认为这缺少了一些东西。但现在它就像一个魅力:)
猜你喜欢
  • 2016-03-04
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2019-08-29
  • 1970-01-01
相关资源
最近更新 更多