如何在 nwjs 的 webview 标签中获取和设置 cookies?
How can I get and set cookies inside webview tag of nwjs?
所以我的应用程序只是打开一个新的 window 本地 html 文件,其中包含某个网页的 webview 标签。但是当我试图获取 cookie 时,我无法获取 anything.I 认为原因是 cookie 绑定到 webview 标签的 url 但现在我的本地文件但是当我只能获取 window of the local file.How 我可以解决这个问题吗?
可能会迟到,但我会为以后的访客回答这个问题:P
我认为无需任何变通方法即可设置和获取 cookie 的最佳且直接的方法是使用 webview 请求拦截器并更改请求和响应 headers 这更安全可靠,并且可以在 nodewebkit 中使用,电子和铬扩展和应用程序:
所以要设置 headers 你可以使用 onBeforeSendHeaders
,
例如,假设您想更改一个名为 "connect.sid" 的 cookie,它在 expressjs 中用作 session 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");
要阅读 headers,您可以使用 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");
注意: 您还可以使用此方法为您的主要 window 设置和获取 cookie,但您可以拦截 [=15 而不是拦截 webview.request
=] 或者只使用 chrome.cookies.set
和 chrome.cookies.get
,我在 chromium 源代码中找到了所有这些东西;)
所以我的应用程序只是打开一个新的 window 本地 html 文件,其中包含某个网页的 webview 标签。但是当我试图获取 cookie 时,我无法获取 anything.I 认为原因是 cookie 绑定到 webview 标签的 url 但现在我的本地文件但是当我只能获取 window of the local file.How 我可以解决这个问题吗?
可能会迟到,但我会为以后的访客回答这个问题:P
我认为无需任何变通方法即可设置和获取 cookie 的最佳且直接的方法是使用 webview 请求拦截器并更改请求和响应 headers 这更安全可靠,并且可以在 nodewebkit 中使用,电子和铬扩展和应用程序:
所以要设置 headers 你可以使用 onBeforeSendHeaders
,
例如,假设您想更改一个名为 "connect.sid" 的 cookie,它在 expressjs 中用作 session 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");
要阅读 headers,您可以使用 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");
注意: 您还可以使用此方法为您的主要 window 设置和获取 cookie,但您可以拦截 [=15 而不是拦截 webview.request
=] 或者只使用 chrome.cookies.set
和 chrome.cookies.get
,我在 chromium 源代码中找到了所有这些东西;)