【问题标题】:In Electron, is the default session persistent?在 Electron 中,默认会话是持久的吗?
【发布时间】:2016-12-31 22:53:12
【问题描述】:

我使用的是 Electron (v1.2.7),我需要会话 cookie 在应用重新启动之间持续存在(用于身份验证)。

有可能吗?我知道在 Chrome 中,当您设置“从上次中断的地方继续”时,会话会保留,但不确定这在 Electron 中是否同样有效。

作为一种解决方法,我尝试将会话 cookie 也存储为非会话 cookie,但失败并出现一般错误。

澄清:我没有设置其他网页在身份验证期间设置的会话 cookie。

【问题讨论】:

    标签: session cookies electron


    【解决方案1】:

    默认会话是持久的,但如果您使用 session.defaultSession.cookies.set() 设置 cookie,则必须设置过期日期才能使 cookie 持久。

    【讨论】:

    • 我们的代码不是设置 cookie 的代码,它们是由访问的其他网页设置的(在身份验证期间和 iframe 上,如果重要的话)。
    • @AmitApple 你是如何关闭你的应用程序的,app.quit()process.exit()
    • 没关系,我一直希望保持会话。
    • @AmitApple 这很重要,因为如果应用程序没有完全关闭,那么会话数据可能不会保存到磁盘。
    • 我们使用app.quit(),但由于会话cookie是在此之前设置的,所以没关系。
    【解决方案2】:

    您可以将 cookie 设置为 sessionexpirationDate

    这个例子是在 Angularjs 上制作的

    var session = require('electron').remote.session;
    var ses = session.fromPartition('persist:name');
    
    this.put = function (data, name) {
            var expiration = new Date();
            var hour = expiration.getHours();
            hour = hour + 6;
            expiration.setHours(hour);
            ses.cookies.set({
                url: BaseURL,
                name: name,
                value: data,
                session: true,
                expirationDate: expiration.getTime()
            }, function (error) {
                /*console.log(error);*/
            });
        };
    

    PD:我遇到的一个问题是,如果我不坚持它们,在重新加载几次后,我的 cookie 就会丢失。所以在这个例子中我会坚持他们 6 小时

    【讨论】:

    • 如何从主渲染器访问所有会话?谢谢
    【解决方案3】:

    如果您正在加载外部网页,您应该使用 Electrons <webview> tag 来禁用节点集成和其他安全原因。使用 webview 可以让您轻松访问可以设置为持久的Partition attribute(例如:persist:mypage)。如果需要,您还可以在 Electron 窗口上设置分区属性。

    【讨论】:

      【解决方案4】:

      我正在加载一个外部网页,下面的配置对我有用。默认情况下,网页配置为使用“会话 cookie”,这就是为什么我将其更改为“持久 cookie”,有效期为 2 周:

      // Modules to control application life and create native browser window
      const {app, BrowserWindow} = require('electron')
      const path = require('path')
      const util = require('util')
      
      function createWindow () {
        // Create the browser window.
        const mainWindow = new BrowserWindow({
          width: 700,
          height: 500,
          webPreferences: {
            preload: path.join(__dirname, 'preload.js'),
            partition: 'persist:infragistics'
          },
          icon: __dirname + '/assets/favicon.ico',
          show:false
        })
      
      
      
        let cookies = mainWindow.webContents.session.cookies;
        cookies.on('changed', function(event, cookie, cause, removed) {
          if (cookie.session && !removed) {
            let url = util.format('%s://%s%s', (!cookie.httpOnly && cookie.secure) ? 'https' : 'http', cookie.domain, cookie.path);
            console.log('url', url);
            cookies.set({
              url: url,
              name: cookie.name,
              value: cookie.value,
              domain: cookie.domain,
              path: cookie.path,
              secure: cookie.secure,
              httpOnly: cookie.httpOnly,
              expirationDate: new Date().setDate(new Date().getDate() + 14)
            }, function(err) {
              if (err) {
                log.error('Error trying to persist cookie', err, cookie);
              }
            });
          }
        });
      

      注意:确保您设置了"partition" webPreferences property as well,这一点很重要。

      设置页面使用的会话的字符串。如果分区以 persist: 开头,则页面将使用可用于应用程序中具有相同分区的所有页面的持久会话。如果没有persist: 前缀,页面将使用内存中的会话

      Origin source.

      【讨论】:

        猜你喜欢
        • 2019-02-08
        • 2021-02-09
        • 2022-10-19
        • 2013-10-29
        • 2017-04-19
        • 2019-01-29
        • 2017-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多