package com.common;
import javax.servlet.http.HttpServletRequest;
public class RemortIP {
private static final String[] PROXY_REMOTE_IP_ADDRESS = { "X-Forwarded-For","Proxy-Client-IP", "WL-Proxy-Client-IP", "X-Real-IP" };
private static final Pattern INNER_IP_ADDR_RE = Pattern.compile("(10\\.)|(172\\.((1[6-9])|(2[0-9])|(3[0-1]))\\.)|(192\\.168\\.)");
/**
* 是否局域网ip地址
* @time 2016年6月22日
* @param ip
* @return true 是,false 否
*/
public static boolean isInnerIpAddr(String ip) {
Matcher ipmatcher = INNER_IP_ADDR_RE.matcher(ip);
return ipmatcher.find();
}
/**
* 获取客户端真实ip
* @time 2016年6月22日
* @param req
* @return
*/
public static String getClientIP(HttpServletRequest req) {
String ip = "";
for (int i=0; i<PROXY_REMOTE_IP_ADDRESS.length; ++i) {
ip = req.getHeader(PROXY_REMOTE_IP_ADDRESS[i]);
if (StringUtils.isEmpty(ip) || ip.equalsIgnoreCase("unknown")) continue;
ip = getRemoteIpFromForward(ip.trim()).trim();
if (!isInnerIpAddr(ip)) {
return ip;
}
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = req.getRemoteAddr();
}
return ip;
}
/**
* <p>
* 从 HTTP Header 中截取客户端连接 IP 地址。如果经过多次反向代理,
* 在请求头中获得的是以“,<SP>”分隔 IP 地址链,第一段为客户端 IP 地址。
* </p>
*
* @param xforwardIp 从 HTTP 请求头中获取转发过来的 IP 地址链
* @return 客户端源 IP 地址
*/
private static String getRemoteIpFromForward( String xforwardIp ) {
int commaOffset = xforwardIp.indexOf( ',' );
if ( commaOffset < 0 ) {
return xforwardIp;
}
return xforwardIp.substring( 0 , commaOffset );
}
}
获取请求来源ip地址
最新推荐文章于 2024-01-05 17:46:19 发布