2016-04-04 2 views
1

Итак, мое приложение просто открывает новое окно локального html-файла с тегом webview некоторой веб-страницы. Но когда я пытался получить файлы cookie, я ничего не могу получить. Я считаю, что причина в том, что cookie ограничена URL-адресом тега webview, но теперь мой локальный файл, но когда я могу получить только окно локального файла. Я решаю эту проблему?Как я могу получить и установить куки в теге webview nwjs?

ответ

2

это может быть поздно, но я буду ответить на этот вопрос для будущих посетителей: P

Я думаю, что лучше и прямой путь, чтобы установить и получить печенье без каких-либо обходных путей заключается в использовании WebView запрос перехватчики и изменить запрос и ответ заголовки это более безопасным и надежным, и будет работать в nodewebkit, электронных и хрома расширений и приложений:

Итак, чтобы установить заголовки можно использовать onBeforeSendHeaders, , например позволяет сказать, что вы хотите изменить печенье под названием «connect.sid» который используется как идентификатор сеанса в expressjs, вы можете сделать следующее:

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"); 

Примечание: вы также можете установить и получить печенье для главного окна, используя этот метод, но вместо того, чтобы перехватывать webview.request вы можете перехватить chrome.webRequest или просто использовать chrome.cookies.set и chrome.cookies.get, я нашел все эти вещи в хромовом исходном коде;)