java动态代理
要想了解java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在gof总结的23种设计模式中,有一种叫做代理(proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式。
在我看来所谓的代理模式,和23种设计模式中的“装饰模式”是一个东西。23种设计模式中将它们作为两种模式,网上也有些文章讲这两种模式的异同,从细节来看,确实可以人为地区分这两种模式,但是抽象到一定高度后,我认为这两种模式是完全一样的。因此学会了代理模式,也就同时掌握了装饰模式。
话不多说,先上 code:
var express = require('express');
var request = require('request');
var app = express();
app.use('/', function(req, res) {
var url = 'https://www.baidu.com/' + req.url;
req.pipe(request(url)).pipe(res);
});
app.listen(process.env.port || 3000);
不到 10 行的代码,就实现了简单的代理服务器功能。是不是很神奇?
熟悉 node.js 的话应该很容易看明白这几行代码。首先加载 express 模块,这个是创建 http 服务器的一个流行框架。然后是 request,它封装了 http 请求的各种方法,让发起请求变得非常容易。接下来实例化一个 express 对象,设置访问路由。最后监听 3000 端口。
先看效果。保存上述代码到文件 proxy.js,在文件所在路径执行:
node proxy.js
用浏览器打开localhost:3000/
关键代码在路由处理方法内。
req.pipe(request(url)).pipe(res);
这个 pipe 方法很神奇,正如它的名字(管道)一样,它把浏览器的请求数据传给 request 客户端,然后将目标服务器的响应数据传回浏览器。这代码太tm简洁了!
那么,怎么实现科学上网呢?对,把代码放到没有网络封锁的服务器上运行,就ok了。比如,这个 任度搜 www.rendoso.com 背后就是 google 代理。
以上就是实现简单的代理服务器功能实例的详细内容。