Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
多鱼的夏天
RuoYi-Cloud-Docker
提交
e5c938c6
R
RuoYi-Cloud-Docker
项目概览
多鱼的夏天
/
RuoYi-Cloud-Docker
通知
208
Star
7
Fork
6
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
RuoYi-Cloud-Docker
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
e5c938c6
编写于
3月 27, 2022
作者:
R
RuoYi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
优化IP地址获取到多个的问题
上级
ccf84377
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
88 addition
and
33 deletion
+88
-33
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java
...src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java
+88
-33
未找到文件。
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java
浏览文件 @
e5c938c6
...
@@ -12,58 +12,62 @@ import com.ruoyi.common.core.utils.StringUtils;
...
@@ -12,58 +12,62 @@ import com.ruoyi.common.core.utils.StringUtils;
*/
*/
public
class
IpUtils
public
class
IpUtils
{
{
/**
* 获取客户端IP
*
* @param request 请求对象
* @return IP地址
*/
public
static
String
getIpAddr
(
HttpServletRequest
request
)
public
static
String
getIpAddr
(
HttpServletRequest
request
)
{
{
if
(
request
==
null
)
if
(
request
==
null
)
{
{
return
null
;
return
"unknown"
;
}
}
String
ip
=
request
.
getHeader
(
"x-forwarded-for"
);
String
ip
=
null
;
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
// X-Forwarded-For:Squid 服务代理
String
ipAddresses
=
request
.
getHeader
(
"X-Forwarded-For"
);
if
(
ipAddresses
==
null
||
ipAddresses
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
{
{
// Proxy-Client-IP:apache 服务代理
ip
=
request
.
getHeader
(
"Proxy-Client-IP"
);
ipAddresses
=
request
.
getHeader
(
"Proxy-Client-IP"
);
}
}
if
(
ip
Addresses
==
null
||
ipAddresses
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
{
// WL-Proxy-Client-IP:weblogic 服务代理
ip
=
request
.
getHeader
(
"X-Forwarded-For"
);
ipAddresses
=
request
.
getHeader
(
"WL-Proxy-Client-IP"
);
}
}
if
(
ip
Addresses
==
null
||
ipAddresses
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
{
// HTTP_CLIENT_IP:有些代理服务器
ip
=
request
.
getHeader
(
"WL-Proxy-Client-IP"
);
ipAddresses
=
request
.
getHeader
(
"HTTP_CLIENT_IP"
);
}
}
if
(
ip
Addresses
==
null
||
ipAddresses
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
{
// X-Real-IP:nginx服务代理
ip
=
request
.
getHeader
(
"X-Real-IP"
);
ipAddresses
=
request
.
getHeader
(
"X-Real-IP"
);
}
}
// 有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
if
(
ipAddresses
!=
null
&&
ipAddresses
.
length
()
!=
0
)
{
ip
=
ipAddresses
.
split
(
","
)[
0
];
}
// 还是不能获取到,最后再通过request.getRemoteAddr();获取
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ipAddresses
))
{
{
ip
=
request
.
getRemoteAddr
();
ip
=
request
.
getRemoteAddr
();
}
}
return
ip
.
equals
(
"0:0:0:0:0:0:0:1"
)
?
"127.0.0.1"
:
ip
;
return
"0:0:0:0:0:0:0:1"
.
equals
(
ip
)
?
"127.0.0.1"
:
getMultistageReverseProxyIp
(
ip
);
}
}
/**
* 检查是否为内部IP地址
*
* @param ip IP地址
* @return 结果
*/
public
static
boolean
internalIp
(
String
ip
)
public
static
boolean
internalIp
(
String
ip
)
{
{
byte
[]
addr
=
textToNumericFormatV4
(
ip
);
byte
[]
addr
=
textToNumericFormatV4
(
ip
);
return
internalIp
(
addr
)
||
"127.0.0.1"
.
equals
(
ip
);
return
internalIp
(
addr
)
||
"127.0.0.1"
.
equals
(
ip
);
}
}
/**
* 检查是否为内部IP地址
*
* @param addr byte地址
* @return 结果
*/
private
static
boolean
internalIp
(
byte
[]
addr
)
private
static
boolean
internalIp
(
byte
[]
addr
)
{
{
if
(
StringUtils
.
isNull
(
addr
)
||
addr
.
length
<
2
)
if
(
StringUtils
.
isNull
(
addr
)
||
addr
.
length
<
2
)
...
@@ -124,7 +128,8 @@ public class IpUtils
...
@@ -124,7 +128,8 @@ public class IpUtils
{
{
case
1
:
case
1
:
l
=
Long
.
parseLong
(
elements
[
0
]);
l
=
Long
.
parseLong
(
elements
[
0
]);
if
((
l
<
0L
)
||
(
l
>
4294967295L
)){
if
((
l
<
0L
)
||
(
l
>
4294967295L
))
{
return
null
;
return
null
;
}
}
bytes
[
0
]
=
(
byte
)
(
int
)
(
l
>>
24
&
0xFF
);
bytes
[
0
]
=
(
byte
)
(
int
)
(
l
>>
24
&
0xFF
);
...
@@ -134,12 +139,14 @@ public class IpUtils
...
@@ -134,12 +139,14 @@ public class IpUtils
break
;
break
;
case
2
:
case
2
:
l
=
Integer
.
parseInt
(
elements
[
0
]);
l
=
Integer
.
parseInt
(
elements
[
0
]);
if
((
l
<
0L
)
||
(
l
>
255L
))
{
if
((
l
<
0L
)
||
(
l
>
255L
))
{
return
null
;
return
null
;
}
}
bytes
[
0
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
bytes
[
0
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
l
=
Integer
.
parseInt
(
elements
[
1
]);
l
=
Integer
.
parseInt
(
elements
[
1
]);
if
((
l
<
0L
)
||
(
l
>
16777215L
))
{
if
((
l
<
0L
)
||
(
l
>
16777215L
))
{
return
null
;
return
null
;
}
}
bytes
[
1
]
=
(
byte
)
(
int
)
(
l
>>
16
&
0xFF
);
bytes
[
1
]
=
(
byte
)
(
int
)
(
l
>>
16
&
0xFF
);
...
@@ -150,13 +157,15 @@ public class IpUtils
...
@@ -150,13 +157,15 @@ public class IpUtils
for
(
i
=
0
;
i
<
2
;
++
i
)
for
(
i
=
0
;
i
<
2
;
++
i
)
{
{
l
=
Integer
.
parseInt
(
elements
[
i
]);
l
=
Integer
.
parseInt
(
elements
[
i
]);
if
((
l
<
0L
)
||
(
l
>
255L
))
{
if
((
l
<
0L
)
||
(
l
>
255L
))
{
return
null
;
return
null
;
}
}
bytes
[
i
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
bytes
[
i
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
}
}
l
=
Integer
.
parseInt
(
elements
[
2
]);
l
=
Integer
.
parseInt
(
elements
[
2
]);
if
((
l
<
0L
)
||
(
l
>
65535L
))
{
if
((
l
<
0L
)
||
(
l
>
65535L
))
{
return
null
;
return
null
;
}
}
bytes
[
2
]
=
(
byte
)
(
int
)
(
l
>>
8
&
0xFF
);
bytes
[
2
]
=
(
byte
)
(
int
)
(
l
>>
8
&
0xFF
);
...
@@ -166,7 +175,8 @@ public class IpUtils
...
@@ -166,7 +175,8 @@ public class IpUtils
for
(
i
=
0
;
i
<
4
;
++
i
)
for
(
i
=
0
;
i
<
4
;
++
i
)
{
{
l
=
Integer
.
parseInt
(
elements
[
i
]);
l
=
Integer
.
parseInt
(
elements
[
i
]);
if
((
l
<
0L
)
||
(
l
>
255L
))
{
if
((
l
<
0L
)
||
(
l
>
255L
))
{
return
null
;
return
null
;
}
}
bytes
[
i
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
bytes
[
i
]
=
(
byte
)
(
int
)
(
l
&
0xFF
);
...
@@ -183,6 +193,11 @@ public class IpUtils
...
@@ -183,6 +193,11 @@ public class IpUtils
return
bytes
;
return
bytes
;
}
}
/**
* 获取IP地址
*
* @return 本地IP地址
*/
public
static
String
getHostIp
()
public
static
String
getHostIp
()
{
{
try
try
...
@@ -195,6 +210,11 @@ public class IpUtils
...
@@ -195,6 +210,11 @@ public class IpUtils
return
"127.0.0.1"
;
return
"127.0.0.1"
;
}
}
/**
* 获取主机名
*
* @return 本地主机名
*/
public
static
String
getHostName
()
public
static
String
getHostName
()
{
{
try
try
...
@@ -206,4 +226,39 @@ public class IpUtils
...
@@ -206,4 +226,39 @@ public class IpUtils
}
}
return
"未知"
;
return
"未知"
;
}
}
/**
* 从多级反向代理中获得第一个非unknown IP地址
*
* @param ip 获得的IP地址
* @return 第一个非unknown IP地址
*/
public
static
String
getMultistageReverseProxyIp
(
String
ip
)
{
// 多级反向代理检测
if
(
ip
!=
null
&&
ip
.
indexOf
(
","
)
>
0
)
{
final
String
[]
ips
=
ip
.
trim
().
split
(
","
);
for
(
String
subIp
:
ips
)
{
if
(
false
==
isUnknown
(
subIp
))
{
ip
=
subIp
;
break
;
}
}
}
return
ip
;
}
/**
* 检测给定字符串是否为未知,多用于检测HTTP请求相关
*
* @param checkString 被检测的字符串
* @return 是否未知
*/
public
static
boolean
isUnknown
(
String
checkString
)
{
return
StringUtils
.
isBlank
(
checkString
)
||
"unknown"
.
equalsIgnoreCase
(
checkString
);
}
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录