目前大部分获取ip的方式:beat.getRequest().getRemoteAddr()
可是,若是经过nginx反向代理的话,就获取不到真实ip,是获取的nginx的iphtml
须要:添加 proxy_set_header X-Real-IP $remote_addr; java
server { listen 80; server_name price.kuche.com; location / { root html; proxy_set_header X-Real-IP $remote_addr; proxy_set_hearder host $host; proxy_set_header X-forwarded-For $proxy_add_x_forwarded_for; } }
添加一个表头声明
而后这样取nginx
public static String getRemoteAddrIp(HttpServletRequest request) { String ipFromNginx = getHeader(request, "X-Real-IP"); System.out.println("ipFromNginx:" + ipFromNginx); System.out.println("getRemoteAddr:" + request.getRemoteAddr()); return StringUtil.isEmpty(ipFromNginx) ? request.getRemoteAddr() : ipFromNginx; } private static String getHeader(HttpServletRequest request, String headName) { String value = request.getHeader(headName); return !StringUtils.isBlank(value) && !"unknown".equalsIgnoreCase(value) ? value : ""; }
工具类:工具
/** * @author sammy 获取访问用的真实IP,无视nginx等反向代理软件 * @param request * @return ip地址 */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Real-IP"); if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { return ip; } ip = request.getHeader("X-Forwarded-For"); if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { // 屡次反向代理后会有多个IP值,第一个为真实IP。 int index = ip.indexOf(','); if (index != -1) { return ip.substring(0, index); } else { return ip; } } else { return request.getRemoteAddr(); } }