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

时间:2016-04-04 14:59:33

标签: cookies nw.js

所以我的应用只需打开一个带有某个网页的webview标签的本地html文件的新窗口。但是当我试图获取cookie时,我无法得到任何东西。我认为原因是cookie被绑定到webview标记的url但现在是我的本地文件但是当我只能获取本地文件的窗口时。如何我解决了这个问题?

1 个答案:

答案 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,我在铬源代码中找到了所有这些东西;)