-
Notifications
You must be signed in to change notification settings - Fork 1
/
解析ip地址.ampaper
89 lines (65 loc) · 3.51 KB
/
解析ip地址.ampaper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
{
"title":"解析ip地址来源",
"tag":["ip", "nodejs", "server"]
}
-------------------
公司的网站分为英文、中文两种语言,现在的做法是默认中文,在web中提供按钮,由用户主动点击。
现在打算改进为分析用户的ip地址,判断其来源地区,自动转换中英文。
## 获取客户端ip地址
在网上找到两个nodejs环境中,封装好的函数,解释不明确,实现细节有差异,在一般情况下都能正确获取到IP地址,应该在特殊条件下有差异,改天具体分析,现在先初步完成功能
function getClientIp(req) {
var ipAddress;
var forwardedIpsStr = req.header('x-forwarded-for');
if (forwardedIpsStr) {
var forwardedIps = forwardedIpsStr.split(',');
ipAddress = forwardedIps[0];
}
if (!ipAddress) {
ipAddress = req.connection.remoteAddress||req.socket.remoteAddress ||req.connection.socket.remoteAddress;
}
//::ffff:127.0.0.1
ipAddress = ipAddress.substr(ipAddress.lastIndexOf(':')+1);
return ipAddress;
}
function getClientIp(req) {
return req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
};
其中,`req.header('x-forwarded-for')`是获取代理服务器的ip。
## 根据ip判断地区
<<<<<<< 996a894f1ad79f6eb32c437a698928fae1816463
在网上找到一个IP地址数据库,属于数值IP,
利用shell删除里面不属于中国的ip,然后判断是否为中国即可
先把上面sting类型的ip转换为int类型的ip,
var strip_to_Intip = function(strIp){
var isString = istype('String');
if( isString(strIp) ){
var ipArray = strIp.split('.'); //字符串会被.截断
var intIp = 0;
for (var i = 0; i < ipArray.length; i++) {
intIp += parseInt(ipArray[i])*Math.pow(256, 3-i);
};
return intIp;
}else
throw new Error('ip format err !');
}
进入数据库查找就好了。
=======
找到一个提供ip判断服务的[免费服务器](http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx),它还提供一些其他服务。
发送这个http请求,即可获取信息
GET /WebServices/IpAddressSearchWebService.asmx/getCountryCityByIp?theIpAddress=string HTTP/1.1
Host: www.webxml.com.cn
使用ip地址替换其中的string即可,会返回一段http回复,带着一些xml代码,地址信息就在里面
我使用curl,带着一个ip地址去测试这个功能,实际命令和结果为:
curl www.webxml.com.cn//WebServices/IpAddressSearchWebService.asmx/getCountryCityByIp?theIpAddress=14.154.251.37
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
<string>14.154.251.37</string>
<string>广东省 电信</string>
接下来只要截取字符串比较,就能知道地区了
## 实现方式
测试了一下,这个服务器速度不算快,也不慢,对于一般公司的业务来说,应该没问题。
而且我们公司的首页加载是分步的,先加载图片布局,js代码等,最后加载文字。这样也就给了自己服务器向ip地址服务器获取信息的时间。
>>>>>>> ok