所以我的应用只需打开一个带有某个网页的webview标签的本地html文件的新窗口。但是当我试图获取cookie时,我无法得到任何东西。我认为原因是cookie被绑定到webview标记的url但现在是我的本地文件但是当我只能获取本地文件的窗口时。如何我解决了这个问题?
答案 0 :(得分:2)
可能会迟到但我将为未来的访客回答这个问题:P
我认为在没有任何变通方法的情况下设置和获取cookie的最佳和直接方法是使用webview请求拦截器并更改请求和响应标头,这样更安全可靠,并且可以在nodewebkit,电子和铬扩展和应用程序中使用:
因此要设置标题,您可以使用onBeforeSendHeaders
,
例如,假设您要更改名为“connect.sid”的cookie,该cookie在expressjs中用作会话ID,您可以执行以下操作:
var new_sessionId = "s%randskbksbdfmnsdbf345k345h34k5";
var $webview = $("#my-webview");
$webview.get(0).request.onBeforeSendHeaders.addListener(
function (details) {
details.requestHeaders.forEach(function (header) {
if (header.name === "Cookie") {
var cookies = header.value.split("; ");
var valid_cookies = cookies.filter(function (cookie) {
return cookie && cookie.indexOf("connect.sid") < 0;
});
valid_cookies.push("connect.sid=" + new_sessionId);
header.value = valid_cookies.join("; ");
}
});
return {requestHeaders: details.requestHeaders};
},
{urls: ["<all_urls>"]},
["blocking", "requestHeaders"]
);
$webview.attr("src","http://example.com");
要阅读标题,您可以使用onHeadersReceived
var $webview = $("#my-webview");
$webview.get(0).request.onHeadersReceived.addListener(function (details) {
details.responseHeaders.forEach(function (header) {
if (header.name === "set-cookie") {
var cookies = header.value.split("; ");
var sessionCookie = cookies.find(function (cookie) {
return cookie && cookie.indexOf("connect.sid") === 0;
});
if (sessionCookie) {
var sessionId = sessionCookie.split("=")[1];
console.log(sessionId);
}
}
});
},
{urls: ["<all_urls>"]},
["blocking", "responseHeaders"]
);
$webview.attr("src","http://example.com");
注意:您还可以使用此方法为主窗口设置和获取Cookie,但不是拦截webview.request
,而是拦截chrome.webRequest
或仅使用chrome.cookies.set
}和chrome.cookies.get
,我在铬源代码中找到了所有这些东西;)