如何避免在phonegap / cordova中缓存XMLHttpRequest凭据(NTLM)?

时间:2016-05-04 09:04:21

标签: android ios cordova caching xmlhttprequest

我一直想知道从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”,   “位置=无,clearsessioncache =是”);

我想要的是什么:

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

非常感谢专家的帮助。

2 个答案:

答案 0 :(得分:0)

据我所知,在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,您必须构建自定义插件。

答案 1 :(得分:0)

我为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()),但是它似乎比杀死整个应用程序并安排重新启动要好得多。如果有人有更好的解决方案,请分享。