如何在 nwjs 的 webview 标签内获取和设置 cookie?

Yih*_*hou 2 cookies nw.js

所以我的应用程序只是打开一个本地 html 文件的新窗口,其中包含某个网页的 webview 标签。但是当我尝试获取 cookie 时,我无法获取任何内容。我认为原因是 cookie 绑定到 webview 标记的 url,但现在是我的本地文件,但当我只能获取本地文件的窗口时。如何才能我这个问题解决了吗?

Far*_*uti 5

可能会晚一些,但我会为未来的访客回答这个问题: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 源代码中找到了所有这些内容;)