实现代理设置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 ...
随机推荐
- Taurus.MVC 2.0 开源发布:WebAPI开发教程
背景: 有用户反映,Tausus.MVC 能写WebAPI么? 能! 教程呢? 嗯,木有! 好吧,刚好2.0出来,就带上WEBAPI教程了! 开源地址: https://github.com/cyq1 ...
- Java基础Map接口+Collections
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法
问题描述: iPhone越狱了,之后在Cydia中安装Anywhere虚拟定位,但是打开app提示:后台服务未启动,请重新安装应用后使用. 程序无法正常使用... 解决方法: 打开Cydia-已安装, ...
- .NET跨平台之运行与Linux上的Jexus服务器
谈及.NET跨平台,已经不是什么稀奇的事儿.今天我们就以Jexus服务器的部署为例.简单示范下.在这里,我用VMWare虚拟机来搭建Linux运行环境. Linux,我们选择CentOS7.大家可以前 ...
- Java定时任务的常用实现
Java的定时任务有以下几种常用的实现方式: 1)Timer 2)ScheduledThreadPoolExecutor 3)Spring中集成Cron Quartz 接下来依次介绍这几类具体实现的方 ...
- H5 canvas的 width、height 与style中宽高的区别
Canvas 的width height属性 1.当使用width height属性时,显示正常不会被拉伸:如下 <canvas id="mycanvas" width=&q ...
- Android 关于ijkplayer
基于ijkplayer封装支持简单界面UI定制的视频播放器 可以解析ts格式的so库 怎样编译出可以解析ts等格式的so库?就是编译的时候需要在哪一步修改配置? 一些电视台的m3u8 CCTV1综合, ...
- nginx安装
nginx工作模式-->1个master+n个worker进程 安装nginx的所需pcre库[用于支持rewrite模块] 下载软件方法: 搜索 pcre download 网址:http: ...
- WebAPI
WebAPI的Host OWIN IIS WebAPI 的handler和Filter有啥区别? WebAPI 常用 Filters Exception Filter Timer Filter Lo ...
- AutoMapper(六)
返回总目录 List和数组 AutoMapper只要求元素类型的配置而不要求可能会用到的任何数组或者list类型.比如,我们有一个简单的源和目标类型: public class Source{ pub ...