Java服务器端获取客户端真实IP
这篇文章主要解决问题是Java程序开发过程中服务器端获取客户端真实IP地址问题。下面是我给出的解决方案。
首先我们需要在nginx 做代理程序用代理配置设置header头;
在程序使用HttpServletRequest 获取请求头中的携带ip的参数取获取IP地址,主要参数有一下;
"X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR"
通过编写程序实现IP获取
举例说明:
nginx配置
nginx配置一般是在service中进行配置,如下:
server{ listen 6022; proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ... }
X-real-ip: 真实IP地址
X-Forwarded-For: 代理ip地址,有可能有多个
获取HttpServletRequest对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .getRequest();
- 编写程序实现IP获取
import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; public class IpAddrUtil { private static final String[] HEADERS_TO_TRY = { "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR" }; public String getClientIpAddress(HttpServletRequest request) { for (String header : HEADERS_TO_TRY) { String ip = request.getHeader(header); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { String[] ips = ip.split(","); // 如果有多个ip取ip中的第一个位置为真实ip if(ips != null && ips.length > 0){ return ips[0]; } } } String ip = request.getRemoteAddr(); if("127.0.0.1".equals(ip)||"0:0:0:0:0:0:0:1".equals(ip)){ //根据网卡取本机配置的IP InetAddress inet=null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } ip = inet.getHostAddress(); } return ip; } }
问题汇总:
0:0:0:0:0:0:0:1 是什么?
答: 这是ipv6 的本机ip地址。
HEADERS_TO_TRY 的顺序为什么是这样排序?
答:这是根据IP的真实程度去排序获取。
版权声明:本文为qq_35490191原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。