-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHttpUtil.java
More file actions
48 lines (42 loc) · 1.76 KB
/
Copy pathHttpUtil.java
File metadata and controls
48 lines (42 loc) · 1.76 KB
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
package deep.util;
import javax.servlet.http.HttpServletRequest;
/**
* 一般的web程序,都是经过nginx或apache多级转发后才到Web容器中,真实的IP有可能被拦截到外层
* 服务,此时我们取得最终用户的ip会出现错误。
* 在多层代理或者转发情况下是X-Forwarded-For (XFF)是如何产生的呢?
* XFF 在最外面的一层(一般是CDN加速)使用$remote_addr取得真实的用户ip,在向上游发送时会
* 将这个ip后面附上自己的ip,然后转发,上游的服务器会得到如下形式的XFF:
* ip, srvip 注意:前一个ip是用户真实ip,后一个是CDN的ip,两者中间是一个逗号和一个空格
* 一般来说,每一层转发都在原XFF上附加上一个 逗号和一个空格,再加上自己的ip,然后发送给上游Server
* 有时CDN服务商为了自己的安全考虑,不会将自己的ip加入到XFF而是直接发送给上游。
*
* @author dozray
*
*/
public final class HttpUtil {
private HttpUtil() {
};
public static String getIPAddr(HttpServletRequest req) {
String ips = req.getHeader("x-forwarded-for");
String ip = null;
if (ips == null || ips.length() == 0 || "unknown".equalsIgnoreCase(ips)) {
ips = req.getHeader("Proxy-Client-IP");
}
else{
ip = ips.split(",")[0];
}
if(ips == null || ips.length() ==0 || "unknown".equalsIgnoreCase(ips) ){
ip = req.getHeader("WL-Proxy-Client-IP");
}
if(ips == null || ips.length() == 0 || "unknown".equalsIgnoreCase(ips)){
ip = req.getRemoteAddr();
}
if(ips == null || ips.length() == 0 || "unknown".equalsIgnoreCase(ips)){
ip = req.getHeader("HTTP_CLIENT_IP");
}
if(ips == null || ips.length() == 0 || "unknown".equalsIgnoreCase(ips)){
ip = req.getRemoteAddr();
}
return ip ;
}
}