实现代理设置proxy
用户在哪些情况下是需要设置网络代理呢?
1. 内网上不了外网,需要连接能上外网的内网电脑做代理,就能上外网;多个电脑共享上外网,就要用代理;
2.有些网页被封,通过国外的代理就能看到这被封的网站;
3.想隐藏真实IP;
4. 想加快访问网站速度,在网络出现拥挤或故障时,可通过代理服务器访问目的网站。比如A要访问C网站,但A到C网络出现问题,可以通过绕道,假设B是代理服务器,A可通过B, 再由B到C。
我们app的大多数用户情况是第一种.我们参考qq和chrome的插件switchysharp设置代理的方式来设计的界面


我们的项目是基于node-webkit技术进行开发的。
对于浏览器直接发送的请求设置代理可以直接设置chrome.proxy
if (proxy.proxyType == 0) {//不使用代理
chrome.proxy.settings.set({ 'value': { 'mode': 'direct' } }, function (e) { console.log(e) });
} else if (proxy.proxyType == 1) {//使用http代理
chrome.proxy.settings.set({ 'value': { 'mode': 'fixed_servers', rules: { singleProxy: { scheme: 'http', host: proxy.host, port: proxy.port }, bypassList: null } } }, function (e) { console.log(e) });
} else if (proxy.proxyType == 2) {//使用socks代理,可以支持版本4或者5
chrome.proxy.settings.set({ 'value': { 'mode': 'fixed_servers', rules: { singleProxy: { scheme: 'socks' + proxy.ver, host: proxy.host, port: proxy.port }, bypassList: null } } }, function (e) { console.log(e) });
} else if (proxy.proxyType == 3) {//使用系统代理
chrome.proxy.settings.set({ 'value': { 'mode': 'system' } }, function (e) { console.log(e) });
而程序内部使用nodejs发送的请求需要在发送请求时通过option进行配置,才能走代理网络
var options = {
hostname: Common.Config.addrInfo.openApi,
path: '/api/Author/Article/Collected?skip=' + skip + ' & rows=' + this.pageSize,
method : "GET";
headers: {
'Accept' : "application/json",
'Authorization': 'Bearer ' + index.userInfo.token
}
};
var req = require('http').request(HttpUtil.setProxy(options), function (res) {
var err = HttpUtil.resStatus(options, res);
clearTimeout(timeoutEventId);
if (err) {
callback(err);
return;
}
var resData = [];
res.setEncoding('utf8');
res.on('data', function (chunk) {
resData.push(chunk);
}).on("end", function () {
callback(null, resData.join(""));
});
});
req.on('error', function (e) {
clearTimeout(timeoutEventId);
callback(HttpUtil.reqStatus(options, e));
req.end();
});
req.on('timeout', function (e) {
clearTimeout(timeoutEventId);
callback(HttpUtil.reqStatus(options, e));
});
req.end();
}
static setProxy(options) {//设置代理信息
if (this.proxy) {
if (this.proxy.proxyType == 1 || (this.proxy.proxyType == 3 && this.proxy.host && this.proxy.sysProxyType == "PROXY")) {
options.path = "http://" + options.hostname + options.path;
options.hostname = null;
options.host = this.proxy.host;
options.port = this.proxy.port;
} else if (this.proxy.proxyType == 2 || (this.proxy.proxyType == 3 && this.proxy.host && this.proxy.sysProxyType == "SOCKS")) {
try {
if (!this.SocksProxyAgent)
this.SocksProxyAgent = require('socks-proxy-agent');//引用socks代理配置模块
} catch (e) {
this.SocksProxyAgent = null;
}
if (this.SocksProxyAgent) {
var agent = new this.SocksProxyAgent("socks" + this.proxy.ver + "://" + this.proxy.host + ":" + this.proxy.port);
options.agent = agent;
}
}
}
return options;
}
但是经过实践证明这个方法解决不了很多网络代理用户请求我们服务器接口失败的问题。
我们又找到了request模块,经过在有问题的电脑上进行测试这个模块是可以访问成功的。
var options1 = {
url: 'http://openapi.axeslide.com/api/TemplateTypes',
proxy: "http://10.22.138.21:8080",
headers: {
'User-Agent': 'request',
'Authorization': 'Bearer ' + index.userInfo.token,
'Accept' :"application/json"
}
};
this.request.get(options1, function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(response,body,"ok")
} else {
console.log(response,error, "err")
}
})
但是不管是之前的方式还是现在的request模板,在使用socks代理时,接收的数据量超过一定值时返回就会出现问题,然后把之前的socks-proxy-agent
又换了socks5-http-client做测试解决了该问题。
现在说一下测试工具,fiddler和node搭建的socks代理服务器
fiddler相信对大家来对并不陌生,先打开fiddler options选项,然后配置下代理信息,主要是端口号,这里可以设置是否设置成系统代理,设置之后需要重新启动fiddler,如果浏览器配置成走9999 所有的请求fiddler都会抓取到。


搭建socks代理可以从网上找现成的代码,node搭建的。大家也可以下载 http://files.cnblogs.com/files/fangsmile/socks5.zip ,下载后运行node proxy

下面附一段switchysharp的实现代码:
ProxyPlugin.setProxy = function (proxyMode, proxyString, proxyExceptions, proxyConfigUrl) {
if (ProxyPlugin.disabled) return 0;
var config;
ProxyPlugin.proxyMode = Settings.setValue('proxyMode', proxyMode);
ProxyPlugin.proxyServer = Settings.setValue('proxyServer', proxyString);
ProxyPlugin.proxyExceptions = Settings.setValue('proxyExceptions', proxyExceptions);
ProxyPlugin.proxyConfigUrl = Settings.setValue('proxyConfigUrl', proxyConfigUrl);
switch (proxyMode) {
case 'system':
config = {mode:"system"};
break;
case 'direct':
config = {mode:"direct"};
break;
case 'manual':
var tmpbypassList = [];
var proxyExceptionsList = ProxyPlugin.proxyExceptions.split(';');
var proxyExceptionListLength = proxyExceptionsList.length;
for (var i = 0; i < proxyExceptionListLength; i++) {
tmpbypassList.push(proxyExceptionsList[i].trim())
}
proxyExceptionsList = null;
var profile = ProfileManager.parseProxyString(proxyString);
if (profile.useSameProxy) {
config = {
mode:"fixed_servers",
rules:{
singleProxy:ProxyPlugin._parseProxy(profile.proxyHttp),
bypassList:tmpbypassList
}
};
}
else {
var socksProxyString;
if (profile.proxySocks && !profile.proxyHttp && !profile.proxyFtp && !profile.proxyHttps) {
socksProxyString = profile.socksVersion == 4 ? 'socks=' + profile.proxySocks : 'socks5=' + profile.proxySocks;
config = {
mode:"fixed_servers",
rules:{
singleProxy:ProxyPlugin._parseProxy(socksProxyString),
bypassList:tmpbypassList
}
}
}
else {
config = {
mode:"fixed_servers",
rules:{
bypassList:tmpbypassList
}
};
if (profile.proxySocks) {
socksProxyString = profile.socksVersion == 4 ? 'socks=' + profile.proxySocks : 'socks5=' + profile.proxySocks;
config.rules.fallbackProxy = ProxyPlugin._parseProxy(socksProxyString);
}
if (profile.proxyHttp)
config.rules.proxyForHttp = ProxyPlugin._parseProxy(profile.proxyHttp);
if (profile.proxyFtp)
config.rules.proxyForFtp = ProxyPlugin._parseProxy(profile.proxyFtp);
if (profile.proxyHttps)
config.rules.proxyForHttps = ProxyPlugin._parseProxy(profile.proxyHttps);
}
}
tmpbypassList = null;
break;
case 'auto':
if (ProxyPlugin.proxyConfigUrl == memoryPath) {
config = {
mode:"pac_script",
pacScript:{
data:Settings.getValue('pacScriptData', '')
}
};
Settings.setValue('pacScriptData', '');
}
else {
config = {
mode:"pac_script",
pacScript:{
url:ProxyPlugin.proxyConfigUrl
}
}
}
break;
}
ProxyPlugin.mute = true;
ProxyPlugin._proxy.settings.set({'value':config}, function () {
ProxyPlugin.mute = false;
if (ProxyPlugin.setProxyCallback != undefined) {
ProxyPlugin.setProxyCallback();
ProxyPlugin.setProxyCallback = undefined;
}
});
profile = null;
config = null;
return 0;
};
实现代理设置proxy的更多相关文章
- C#程序中设置全局代理(Global Proxy)
1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1 //设置代理 2 WebProxy WP = new Web ...
- [Z] C#程序中设置全局代理(Global Proxy)
https://www.cnblogs.com/Javi/p/7274268.html 1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1 ...
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- JAVA HTTP请求 常用的代理设置
由于公司上网实行代理机制, 而最近一段时间又在研究Web上的OpenApi. 没办法一定要使用代理,我之前有文章介绍了httpclient的代理使用方式, 这里介绍基本java的代理使用方式. 最常使 ...
- Django如何设置proxy
设置porxy的原因 一般情况下我们代理设置是针对与浏览器而言,通常只需在浏览器设置中进行配置,但它只针对浏览器有效,对我们自己编写的程序并任何效果,这时就需要我们在软件编码中加入代理设置. --- ...
- git 代理设置
git 代理设置: git config --global http.proxy http://proxy.com:8080git config --global https.proxy http:/ ...
- HttpURLConnection中使用代理(Proxy)及其验证(Authentication)
HttpURLConnection中使用代理(Proxy)及其验证(Authentication) 使用Java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任 ...
- 接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头
目录 https请求 代理设置 请求头设置 获取状态码 接收响应头 https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, H ...
- nodejs爬虫笔记(二)---代理设置
node爬虫代理设置 最近想爬取YouTube上面的视频信息,利用nodejs爬虫笔记(一)的方法,代码和错误如下 var request = require('request'); var chee ...
随机推荐
- 日期格式代码出现两次的错误 ORA-01810
错误的原因是使用了两次MM . 一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 11:11:21','yyyy-MM-dd ...
- CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15
之前有位搞平面的好友“小瘦”说CDR X8无法破解,只能用X7.呃……呃……呃……好像是的 其实CDR8难激活主要在于一个点“没有离线激活了,只可以在线激活”,逆天不是专供逆向的,当然没能力去破解,这 ...
- 我为NET狂官方面试题-数据库篇
求结果:select "1"? 查找包含"objs"的表?查找包含"o"的数据库? 求今天距离2002年有多少年,多少天? 请用一句SQL获 ...
- Spring之旅(2)
Spring简化Java的下一个理念:基于切面的声明式编程 3.应用切面 依赖注入的目的是让相互协作的组件保持松散耦合:而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件. AOP面向切面 ...
- Hive安装配置指北(含Hive Metastore详解)
个人主页: http://www.linbingdong.com 本文介绍Hive安装配置的整个过程,包括MySQL.Hive及Metastore的安装配置,并分析了Metastore三种配置方式的区 ...
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- 云瓣影音网站&&微信端(已开源)
随着该项目的发布到线上(小打小闹),即将又要开启另一段崭新的旅程.强迫自己停下来写写所学所得,个人认为总结和分享是一种很棒的学习方式.那让我们先来瞧瞧项目长的什么样.如果着急要源码的朋友,可以下拉到最 ...
- 新手学习web遇到的一些乱码问题
在新手学习web网站学习的时候经常会遇到?????这种乱码,对于刚起步的菜鸟来说真的很头痛,很容易打击继续学的信心当然了对于菜鸟的我最近也遇到过乱码问题,沉浸其中不能自拔,爱的深啊!!!!!我所遇到的 ...
- SQLServer如何添加try catch
在.net中我们经常用到try catch.不过在sqlserver中我们也可以使用try catch捕捉错误,在这里把语法记录下来和大家分享一下, --构建存储过程CREATE PROCEDURE ...
- 让 ASP.NET vNext 在 Mac OS 中飞呀飞。。。
写在前面 阅读目录: 娓娓道来 Install ASP.NET vNext Command Line Tools 安装 Homebrew 使用 Homebrew,安装 KVM Install Subl ...