【问题标题】:How to avoid XMLHttpRequest credentials (NTLM) from being cached in phonegap/cordova?如何避免 XMLHttpRequest 凭据 (NTLM) 缓存在 phonegap/cordova 中?
【发布时间】:2016-08-29 14:52:51
【问题描述】:

我一直想知道从 XMLHttpRequest 接收到的 cookie 存储在哪里(在 Android/iOS 中)......

情况:

我执行 XHR 请求以进行身份​​验证。出于某种原因,这会启动一种会话,并且我执行的所有其他请求不再需要凭据。这种情况是需要的,但应用程序中有一个部分需要其他凭据。当我执行另一个 XHR 请求时,无论我使用哪个凭据,它都会继续使用我最初输入的凭据。

我用什么:

  • jQueryMobile
  • 角度

我注意到 [ANDROID]:

  • 凭据或会话在应用重新启动时被终止! (不是在后台时 - 就像按下后退按钮时一样 - 它需要完全关闭)。那么我必须重新登录。

我的尝试没有成功:

  • 当我想要使用新的凭据时向 URL 添加一个参数。

    var xhr = new XMLHttpRequest;
    xhr.open('GET', 'test.html?_=' + new Date().getTime());
    xhr.send();
    
  • InAppBrowser 功能:

window.open("index.html", "_self", "location=no,clearsessioncache=yes");

我想要什么:

  • 我不知道在哪里可以找到该会话...我真的很想知道它的存储位置。我需要一种删除/清除它的方法,以便我可以使用其他 XMLHttpCredentials 执行另一个成功的调用。
  • 请记住,我仍然想使用 XMLHttpRequest 自动提供的缓存功能。

我们将不胜感激专家的任何帮助。

【问题讨论】:

  • 您是否尝试过检查document.cookie 以查看第一次访问后是否存储了身份验证cookie?如果是这样,你会想在那里清除它。 Cordova 应用程序将使用平台提供的任何浏览器工具包(WebView、WkWebview 或 UIWebView),它们都会为您创建的会话存储 cookie。
  • console.log(document.cookie);日志“”。

标签: android ios cordova caching xmlhttprequest


【解决方案1】:

据我所知,在 Android 上清除这些凭据的唯一方法是重启应用。如果您确实需要,可以通过编程方式执行此操作。

在 iOS 上,您可以在 sharedCredentialStorage 中管理保存的凭据。例如,要删除所有凭据:

NSDictionary* credentialsDict = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials];

for (NSURLProtectionSpace* protectionSpace in credentialsDict){
    NSDictionary* userNameDict = credentialsDict[protectionSpace];
    for (NSString* userName in userNameDict){
        NSURLCredential* credential = userNameDict[userName];
        [[NSURLCredentialStorage sharedCredentialStorage] removeCredential:credential forProtectionSpace:protectionSpace];
    }
}    

为了访问本机 API,您必须构建一个自定义插件。

【讨论】:

  • 你有安卓的替代品吗?我必须搜索哪个方向才能获得相同的结果?
【解决方案2】:

我为Android找到的解决方案不是重新启动整个应用程序,而是将登录活动隔离在一个单独的进程中,然后通过添加 Process.killProcess 覆盖 onDestroy() 方法(Process.myPid()).

在清单中:

<activity
        android:name=".Activities.AdfsLoginActivity"
        android:noHistory="true"
        android:excludeFromRecents="true"
        android:process=":adfsLoginProcess"
        android:windowSoftInputMode="stateHidden|adjustResize" />

在 LoginActivity 中:

@Override
protected void onDestroy() {
    super.onDestroy();
    //kills current process - adfsLoginProcess
    Process.killProcess(Process.myPid());
}

这个解决方案并不完美(因为我不是 Process.killProcess() 的粉丝),但它似乎比杀死整个应用程序并安排重启要好得多。如果有人有更好的解决方案,请分享。

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2016-12-19
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2014-03-25
    相关资源
    最近更新 更多