原文:https://github.com/electron/electron/blob/master/docs/api/session.md
译者:Lin
管理浏览器会话、cookie,缓存,代理设置等。
进程:主进程
session
模块可以被用来创建新的Session
对象。
你也可以通过使用WebContents
的属性session
来获取现存页面的session
,或者从session
模块获取。
const {BrowserWindow} = require('electron')
let win = new BrowserWindow({width: 800, height: 600})
win.loadURL('http://github.com')
const ses = win.webContents.session
console.log(ses.getUserAgent())
方法
session
模块有以下方法:
session.fromPartition(partition[, options])
-
partition
String类型 -
options
Object类型-
cache
Boolean类型 - 是否可以使用缓存。
-
返回值为Session
类型 - 从partition
字符串获取的会话。当这里存在一个拥有同样的partition
的Session
,它将会被返回;否则一个新的Session
实例将会通过options
被创建。
如果partition
是以persist:
开头的,这个页面将会使用一个在应用中对所有页面的相同partition
永久有效的会话。如果没有persist:
前缀,页面将会使用内存会话。如果partition
是空的,那么应用的默认会话将会被返回。
使用options
创建一个Session
,你必须保证Session
的partition
在之前从来没有被使用过。这里没有方法改变一个存在的Session
对象的options
。
属性
session
模块有以下属性:
session.defaultSession
一个Session
对象,应用的默认会话对象。
类:Session
获取并设置一个会话的属性。
进程:主进程
你可以使用session
模块来创建一个新的Session
对象。
const {session} = require('electron')
const ses = session.fromPartition('persist:name')
console.log(ses.getUserAgent())
实例的事件
以下事件在Session
的实例中有效:
事件:'will-download'
-
event
Event类型 -
item
DownloadItem类型 -
webContents
WebContents类型
当Electron
要下载webContents
中的item
的时候被分发。
调用event.preventDefault()
将取消下载,并且item
将从下一个进程标记起不再有效。
const {session} = require('electron')
session.defaultSession.on('will-download', (event, item, webContents) => {
event.preventDefault()
require('request')(item.getURL(), (data) => {
require('fs').writeFileSync('/somewhere', data)
})
})
实例的方法
以下方法在Session
的实例中有效:
ses.getCacheSize(callback)
-
callback
Function类型-
size
Integer类型 - 使用的缓存大小,以字节为单位。
-
回调会返回这个会话的当前缓存大小。
ses.clearCache(callback)
-
callback
Function类型 - 当操作完成时被调用
清空会话的HTTP缓存。
ses.clearStorageData([options, callback])
-
options
Object类型(可选参数)-
origin
String类型 - 应该遵循window.location.origin
的表述方式scheme://host:port
。 -
storages
String[]类型 - 要清除的存储类型,可以包含:appcache
、cookies
、filesystem
、indexdb
、localstorage
、shadercache
、websql
、serviceworkers
-
quotas
String[]类型 - 要清除的量的类型,可以包含:temporary
、persistent
、syncable
。
-
-
callback
Function类型(可选参数)- 当操作完成时被调用。
清除网络存储数据。
ses.flushStorageData()
将还没有写入的DOMStorage写入磁盘。
ses.setProxy(config, callback)
-
config
Object类型-
pacScript
String类型 - 与PAC文件相关的URL。 -
proxyRules
String类型 - 规定要使用的代理的标志。 -
proxyBypassRules
String类型 - 规定需要绕过代理设置的URL的标志。
-
-
callback
Function类型 - 当操作完成时被调用。
配置代理设置。
当pacScript
和proxyRules
被一起提供,proxyRules
选项被忽视,pacScript
选项被应用。
proxyRules
遵循以下规则:
proxyRules = schemeProxies[";"]
schemeProxies = ["="]
urlScheme = "http" | "https" | "ftp" | "socks"
proxyURIList = [","]
proxyURL = ["://"][":"]
例如:
-
ttp=foopy:80;ftp=foopy2
- 使用HTTP代理foopy:80
的http://
地址,使用HTTP代理foopy2:80
的ftp://
地址。 -
foopy:80
- 使用HTTP代理foopy:80的所有地址。 -
foopy:80,bar,direct://
- 使用HTTP代理foopy:80
的所有地址,如果foopy:80
不可用则换为bar
,如果bar
也不可用那就不使用代理。 -
socks4://foopy
- 使用SOCKS v4代理foopy:1080
的所有地址。 -
http=foopy,socks5://bar.com
- 使用HTTP代理foopy
的所有http地址,如果foopy
不可用就换为使用SOCKS5代理bar.com
。 -
http=foopy,direct://
- 使用HTTP代理foopy
的所有http地址,如果foopy
不可用就不使用代理。 -
http=foopy;socks=foopy2
- 使用HTTP代理foopy
的所有http地址,并使用socks4://foopy2代理其他所有的地址。
proxyBypassRules
是一个使用逗号分隔的列表,规则描述见下面:
-
[ URL_SCHEME "://" ] HOSTNAME_PATTERN [ ":"
] 匹配所有hostnames that match the pattern HOSTNAME_PATTERN.
例如:"foobar.com", "foobar.com", ".foobar.com", "foobar.com:99", "https://x..y.com:99"
* `"." HOSTNAME_SUFFIX_PATTERN [ ":" PORT ]` 匹配一个特定的后缀范围。
例如:".google.com", ".com", "http://.google.com"
-
[ SCHEME "://" ] IP_LITERAL [ ":" PORT ]
匹配符合IP地址字面量的地址。
例如:"127.0.1", "[0:0::1]", "[::1]", "http://[::1]:99"
-
IP_LITERAL "/" PREFIX_LENGHT_IN_BITS
Match any URL that is to an IP literal that falls between the given range. IP范围使用CIDR符号指定。
例如:"192.168.1.1/16", "fefe:13::abc/33".
-
匹配本地地址。
的意思是匹配到这之中的任何一个:"127.0.0.1","::1","localhost"。
ses.resolveProxy(url, callback)
-
url
URL类型 -
callback
Function类型-
proxy
String类型
-
解析url
的协议信息。当请求被执行的时候callback
将要被callback(proxy)
调用。
ses.setDownloadPath(path)
-
path
String类型 - 下载位置
设置下载保存目录。默认情况下,下载目录将是在各自应用的文件夹中的Downloads
文件夹下。
ses.enableNetworkEmulation(options)
-
options
Object类型-
offline
Boolean类型(可选参数)- 是否模拟网络断开。默认为false
。 -
latency
Double类型(可选参数)- ms为单位的RTT。默认是0,即禁止限制延迟。 -
downloadThroughput
Double类型(可选参数)- Bps为单位的下载速度。默认是0,即禁止限制下载。 -
uploadThroughput
Double类型(可选参数)- Bps为单位的上传速度。默认是0,即禁止限制上传。
-
session
中使用给定的配置模拟网络。
// 使用50kbps吞吐量和500ms延迟来模拟一个GPRS链接。
window.webContents.session.enableNetworkEmulation({
latency: 500,
downloadThroughput: 6400,
uploadThroughput: 6400
})
// 模拟一个网络中断。
window.webContents.session.enableNetworkEmulation({offline: true})
ses.disableNetworkEmulation()
禁用session
中已经开启的网络模拟。将重置为原来的网络配置。
ses.setCertificateVerifyProc(proc)
-
proc
Function类型-
request
Object类型-
hostname
String类型 -
certificate
Certificate类型 -
error
String类型 - 从chromium中验证结果。
-
-
callback
Function类型-
verificationResult
Integer类型 - 值可以是这里面的证书错误代码之一。除了证书错误代码之外还可以使用下面的特殊代码。-
0
- 表示成功,并且不允许Certificate Transperancy验证。 -
-2
- 表示失败。 -
-3
- 使用chromium的验证结果。
-
-
-
设置session
的证书验证过程,当一个服务器证书验证被请求,proc
将会被proc(request, callback)
调用 whenever a server certificate verification is requested. 调用callback(0)
接受这个证书,调用callback(-2)
拒绝这个证书。
调用setCertificateVerifyProc(null)
将会恢复回默认的证书验证过程。
const {BrowserWindow} = require('electron')
let win = new BrowserWindow()
win.webContents.session.setCertificateVerifyProc((request, callback) => {
const {hostname} = request
if (hostname === 'github.com') {
callback(0)
} else {
callback(-2)
}
})
ses.setPermissionRequestHandler(handler)
-
handler
Function类型-
webContents
Object类型 - WebContents请求许可。 -
permission
String类型 - 枚举值为'media','geolocation','notifications','midiSysex','pointerLock','fullscreen','openExternal'。 -
callback
Function类型-
permissionGranted
Boolean类型 - 允许或者拒绝这个许可。
-
-
设置session
的许可请求的回复处理。调用callback(true)
将允许这个许可,调用callback(false)
将拒绝这个许可。
const {session} = require('electron')
session.fromPartition('some-partition').setPermissionRequestHandler((webContents, permission, callback) => {
if (webContents.getURL() === 'some-host' && permission === 'notifications') {
return callback(false) // denied.
}
callback(true)
})
ses.clearHostResolverCache([callback])
-
callback
Function类型(可选参数)- 当操作完成时被调用。
清空主机解析器的缓存。
ses.allowNTLMCredentialsForDomains(domains)
-
domains
String类型 - A comma-seperated list of servers for which integrated authentication is enabled.
Dynamically sets whether to always send credentials for HTTP NTLM or Negotiate authentication.
const {session} = require('electron')
// 考虑到任何使用`example.com`, `foobar.com`, `baz`结尾的url的集成认证。
session.defaultSession.allowNTLMCredentialsForDomains('*example.com, *foobar.com, *baz')
// 考虑到所有的url的集成认证。
session.defaultSession.allowNTLMCredentialsForDomains('*')
ses.setUserAgent(userAgent[, acceptLanguages])
-
userAgent
String类型 -
acceptLanguages
String类型(可选参数)
重写这个会话的userAgent
和acceptLanguages
。
acceptLanguages
必须是一个逗号分隔的语言代码的命令列表,例如:"en-US,fr,de,ko,zh-CN,ja"
。
这个不能影响到当前存在的WebContents
,每个WebContents
可以使用webContents.setUserAgent
来重写会话范围内的用户代理。
ses.getUserAgent()
返回值为String
类型 - 这个会话的用户代理
ses.getBlobData(identifier, callback)
-
identifier
String类型 - 有效的UUID。 -
callback
Function类型-
result
Buffer类型 - Blob数据。
-
返回值为Blob
类型 - 与identifier
相关的blob数据。
ses.createInterruptedDownload(options)
-
options
Object类型-
path
String类型 - 下载的绝对路径。 -
urlChain
String[]类型 - 完整的下载链接。 -
mimeType
String类型(可选参数) -
offset
Integer类型 - 下载的起始范围。 -
length
Integer类型 - 下载的总长度。 -
lastModified
String类型 - 最后修改头的值。 -
eTag
String类型 - ETag头的值。 -
startTime
Double类型(可选参数)- Time when download was started in number of seconds since UNIX epoch.
-
允许在之前的Session
中重新开始cancelled
或interrupted
下载。这个接口将生成一个可以被will-download事件使用的DownloadItemhttps://github.com/electron/electron/blob/master/docs/api/download-item.md。这个DownloadItem将没有任何和它相关的WebContents
,并且最开始的状态将会被interrupted
。这个下载将只在DownloadItem中调用resume
接口时启动。
ses.clearAuthCache(options[, callback])
-
options
(RemovePassword | RemoveClientCertificate)类型 -
callback
Function类型(可选参数)- 当操作完成时被调用。
清空会话的HTTP验证缓存。
实例的属性
以下属性在Session
的实例中有效:
ses.cookies
这个会话的Cookie对象。
ses.webRequest
这个会话的WebRequest对象。
ses.protocol
这个会话的Protocol对象(一个protocol模块的实例)。
const {app, session} = require('electron')
const path = require('path')
app.on('ready', function () {
const protocol = session.fromPartition('some-partition').protocol
protocol.registerFileProtocol('atom', function (request, callback) {
var url = request.url.substr(7)
callback({path: path.normalize(`${__dirname}/${url}`)})
}, function (error) {
if (error) console.error('Failed to register protocol')
})
})