所以我的应用程序只是打开一个本地 html 文件的新窗口,其中包含某个网页的 webview 标签。但是当我尝试获取 cookie 时,我无法获取任何内容。我认为原因是 cookie 绑定到 webview 标记的 url,但现在是我的本地文件,但当我只能获取本地文件的窗口时。如何才能我这个问题解决了吗?
可能会晚一些,但我会为未来的访客回答这个问题: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");
Run Code Online (Sandbox Code Playgroud)
并读取标题,您可以使用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");
Run Code Online (Sandbox Code Playgroud)
注意:您还可以使用此方法为主窗口设置和获取 cookie,但webview.request您可以拦截chrome.webRequest或仅使用chrome.cookies.setand代替拦截chrome.cookies.get,我在 chromium 源代码中找到了所有这些内容;)
| 归档时间: |
|
| 查看次数: |
1707 次 |
| 最近记录: |