/**
* <p>
* Web 服务器反向代理中用于存放客户端原始 IP 地址的 Http header 名字,若新增其他的需要修改其中的值。
* </p>
*/
private final static String[] PROXY_REMOTE_IP_ADDRESS = {
"X-Forwarded-For", "X-Real-IP" };
/**
* <p>
* 获取请求的客户端的 IP 地址。若应用服务器前端配有反向代理的 Web 服务器, 需要在 Web 服务器中将客户端原始请求的 IP 地址加入到
* HTTP header 中。 详见 {@link ServletUtil#PROXY_REMOTE_IP_ADDRESS}
* </p>
*
* @param request
* @return
*
* @author Macro
*/
public static String getRemoteIp(HttpServletRequest request) {
for (int i = 0; i < PROXY_REMOTE_IP_ADDRESS.length; i++) {
String ip = request.getHeader(PROXY_REMOTE_IP_ADDRESS[i]);
if (!StringUtils.isBlank(ip)) {
return getRemoteIpFromForward(ip);
}
}
return request.getRemoteHost();
}
/**
* <p>
* 从 HTTP Header 的 X-Forward-IP 头中截取客户端连接 IP 地址。如果经过多次反向代理, 在 X-Forward-IP
* 中获得的是以“,<SP>”分隔 IP 地址链,第一段为客户端 IP 地址。
* </p>
*
* @param xforwardIp
* @return
*
* @author Macro
* @since 2011-8-11 09:20:13
*/
private static String getRemoteIpFromForward(String xforwardIp) {
int commaOffset = xforwardIp.indexOf(',');
if (commaOffset < 0) {
return xforwardIp;
}
return xforwardIp.substring(0, commaOffset);
}