标签归档:proxy

Proxy in JavaScript

可以代理一个对象,对读取、赋值等操作做拦截,从而可额外地做一些事情,对于没有拦截的操作,则按原对象操作调用。

let p = new Proxy(target, handler);

通过 handler 来提供以下方法(this 指向 代理后的对象,该对象的 [[handler]] 指向 handler):

  • get(target, prop, receiver) 拦截属性读取操作
  • set(target, prop, val, receiver) 拦截设置属性值操作
  • has(target, prop) 可以看作是对 in 的操作的拦截
  • apply(target, thisArg, args) 拦截函数的调用,包括普通调用和 applycall 等。
  • construct(target, args, newTarget) 拦截 new 操作符
  • defineproperty(target, prop, descriptor) 拦截 Object.defineProperty 的操作
  • deleteProperty(target, prop) 拦截 delete 操作
  • getOwnPropertyDescriptor(target, prop) 拦截 Object.getOwnpropertyDescriptor
  • getPrototypeOf(target) 拦截原型对象的读取,包括 Object.getPrototypeOf()__proto__ 以及 instanceof
  • isExtensible(target) 拦截 Object.isExtensible()
  • ownKeys(target) 拦截 Object.getOwnPropertyNames() 以及 Object.keys()
  • preventExtensions(target) 拦截 Object.preventExtensions(obj)
  • setPrototypeOf(target, proto) 拦截 Object.setPrototypeOf

receiver,Proxy 或继承 Proxy 的对象,最初被调用的对象,通常就是 proxy 自身。但如果对象本身无该属性,原型链上有 Proxy 对象,那么这时对象本身就作为 receiver 参数传进来了。1

不仅使用于 Object,也使用于 Reflect,拦截具体对应的操作可能有所区别

Proxy.revocable(target, handler) 创建一个 proxy 并返回撤销该 proxy 的方法。

const { proxy, revoke } = Proxy.revocable(target, handler);
// .. do something with proxy
// 撤销代理
revoke();

参考

Chrome 使用 pac 来自动代理

2018-08-21 更新:这是很早之前的文章,现在 Chrome 的 proxy 插件不少了,不再需要修改命令

之所以有此文,是因为忘记在哪个版本起 Chrome 的如 ProxySwitchy 等扩展就有问题了,在代理方面很有问题,没有 Firefox 下的 autoproxy 稳定。在过了一阵子需要翻只能开 FF 的时间后,决定还是看看 Chrome 下该如何解决这个问题。

查看 chromium / google-chrome 的帮助命令,将可以看到和代理(proxy)有关的有:

--proxy-server=host:port
--no-proxy-server
--proxy-auto-detect
--proxy-pac-url=URL

可以看到,Chrome 是支持指定 pac 文件来自动代理的。这样,便可以使用 使用 pac 文件来实现自动代理 一文提到的 pac 文件了。

这样,便可以通过类似下面的命令来启动带自动代理功能的 Chrome 了。

google-chrome --proxy-pac-url=file:///home/user/autoproxy.pac

对于 Windows 环境,直接把 --prox-pac-url=pac-file-path 参数加到快捷方式属性中的『目标』属性的后面即可。

对于 Ubuntu 环境,Chromium 可以通过把这个参数写进 /etc/chromium-browser/default 文件中的 CHROMIUM_FLAGS 变量;对于 google-chrome,暂时没找到方便写配置的地方,干脆直接写个 sh 文件,把整条命令加进去吧(可在命令后加 & 来达到终端关闭浏览器依然存在的目的)。

使用 pac 文件来实现自动代理

pac(proxy autoconfiguration)文件其实就是一个 JavaScript 文件,文件扩展名是什么其实没有关系,但一般都名为 pac

pac 文件中必须包含 FindProxyForURL(url, host) 的函数,支持 pac 自动代理的浏览器将会根据这个函数来判断当前访问的网址走何种通道。最简单的示例如下

function FindProxyForURL(url, host) {
    return 'DIRECT';
}

上面那段代码说明对于所有 url,都直连,不走任何代理。

FindProxyForURL 函数除了可以返回 “DIRECT” 外,还可以返回指定类型、主机和端口的代理。如:

// 本地 3721 端口的 http 代理
"PROXY 127.0.0.1:3721"

// 本地 8080 端口的 socks5 代理
"SOCKS5 127.0.0.1:8080"

可以同时指定多个方式,从第一种开始,一种无法连接使用下一种,直到成功或最后失败,如:

return "PROXY 127.0.0.1:3721; SOCKS5 127.0.0.1:8080; DIRECT";

继续阅读