Ajax响应中的Set-Cookie标头不能与android webView

时间:2017-11-16 21:00:42

标签: java android http webview sdk

我已经阅读了2天的答案,问题,论坛和博客,但无法解决我的问题。

我使用带有WebView的Native(SDK)Android应用程序中的AngularJS webApp。

一切似乎都有效,但当我的应用程序调用使用" Set-Cookie"响应的服务时标题这些cookie没有在webview中设置,当然也没有在下次调用中发送,所以我的应用程序爆炸。

该应用程序在浏览器和cordova以及" document.cookie"中完美运行。返回一个空字符串,所以我知道这是失败的地方。

我的网页视图初始化如下:

public class Main extends AppCompatActivity {
...

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView webview = (WebView) findViewById(R.id.webview);
    webview.setWebViewClient(new mWebViewClient());

    webview.getSettings().setAppCacheEnabled(true);
    webview.getSettings().setDomStorageEnabled(true);
    webview.getSettings().setSavePassword(true);
    webview.getSettings().setAllowFileAccessFromFileURLs(true);
    webview.getSettings().setAllowContentAccess(true);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setUserAgentString(...);
    webview.loadUrl("file:///android_asset/www/index.html");

    javascriptAPI = new JavascriptAPI(this);
    webview.addJavascriptInterface(javascriptAPI, "jsAPI");
    ...
  }
  ...
}

我也尝试过来自这里和那里的大量代码:

        CookieSyncManager.createInstance(this);
        CookieSyncManager.getInstance().run();
        CookieManager.getInstance().setAcceptCookie(true);

但它既不起作用。

我的应用程序正在调用一些使用重定向的服务,因此从JS获取cookie并设置它们不是一个选项,我需要webview像浏览器一样工作。

这是我的第一个SDK Android应用程序,我完全不确定哪些信息可以与回答问题(清单,jsAPI等)相关,所以不要犹豫,并且我不会说。 ll发布任何其他需要的东西

解决

谢谢@Mark,这修复了我的代码:

(在活动onCreate中)

...
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    CookieSyncManager.createInstance(this);
}
 ^^^^^^^
  THIS


WebView webview = (WebView) findViewById(R.id.webview);

CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().run();
CookieManager.getInstance().setAcceptCookie(true);
CookieManager.getInstance().setAcceptFileSchemeCookies(true); <- THIS
CookieManager.getInstance().setAcceptThirdPartyCookies(webview, true); <- THIS

webview.setWebViewClient(new mWebViewClient());
webview.getSettings().setAppCacheEnabled(true);
...

1 个答案:

答案 0 :(得分:1)

您需要担心三种acceptCookie方法,并考虑多个Android版本的不同行为。

1)我注意到您的初始网址是pid = fork(); if (pid == -1) { printf("Failed forming fork\n"); return; } else if (pid == 0) { strcpy( cmd , "/usr/bin/"); strcat( cmd, command); execl(cmd, command, args, NULL); }else{ wait(NULL); } 网址。您可能需要致电file://

2)在Android Lollipop及更高版本中,您可能需要拨打CookieManager.getInstance().setAcceptFileSchemeCookies(true);

3)对于Android版本&lt;棒棒糖,如果你想要持久化cookie(例如,在轮换期间存活),你必须采取一些步骤来手动管理同步。

首先,确保在应用程序启动期间初始化CookieSyncManager,方法是将其添加到应用程序类'onCreate(),或者扩展它。

CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);

其次,您需要为棒棒糖前设备设置同步,最后启用Cookie。以下是您可以扩展的示例活动,它为Lollipop之前的设备设置所有同步,并提供public class CookieApplication extends Application { @Override public void onCreate() { super.onCreate(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { CookieSyncManager.createInstance(this); } } } ,无论Android版本如何,都应启用所有Cookie类型(请注意,在安装时需要考虑安全性调用这些方法!)。请注意,必须在初始化webView后调用所有CookieManager.getInstance()。set * Cookie *()方法。

enablesCookies(webView)