Java获取客户端真实IP

Get the Real IP of Client in Java Server
郄正元 2020-08-21 18:28:29 Java ${viewCount} ${commentCount}

Java获取客户端真实IP的代码

import javax.servlet.http.HttpServletRequest; public class IpUtil { private static final String[] IP_HEADERS_TO_TRY = { // 依次尝试从这些请求头中获取真实IP,按照优先级顺序排列 "X-Forwarded-For", // 代理服务器最常用请求头,格式:client, proxy1, proxy2, proxy3... 以英文逗号和空格分隔 "Proxy-Client-IP", // Apache会用 "WL-Proxy-Client-IP", // WebLogic会用 "HTTP_CLIENT_IP", // 某些代理服务器会用 "HTTP_X_FORWARDED_FOR", // 某些代理服务器会用 "X-Real-IP"// Nginx一般会用 }; /** * 从HttpServletRequest中获取客户端真实IP */ public static String getClientIp(HttpServletRequest request) { for (String header : IP_HEADERS_TO_TRY) { String ip = request.getHeader(header); if (ip != null && !ip.trim().isEmpty() && !"unknown".equalsIgnoreCase(ip.trim())) { return ip.split(",", 2)[0].trim(); } } return request.getRemoteAddr(); } }

由于代理服务器的广泛应用(例如运营商为客户端提供的网关代理、网站建设者用的反向代理等),客户端的请求在到达后端服务的过程中可能会经过多重转发,因此必须通过一些特殊的请求头才能获取客户端真实IP。

代理服务器设置

为了能通过上述代码获取客户端真实IP,我们在使用代理服务器时,必须配置特定请求头,这样才能让代理服务器转发请求时携带真实的客户端IP。

例如在Nginx中,需要进行以下设置:

server { listen 80; server_name example.com; location /example/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

注意上面第9~10行,必须让Nginx在转发请求时设置 X-Real-IPX-Forwarded-For 等请求头,这样后端服务才能通过上面的Java代码获取客户端真实IP。

 

 

文章评论
${fromAuthor ? '郄正元' : '游客'} 作者 ${gmtCreate}
${content}
${subList.length}
发表评论
${commentToArticle ? '' : parentContent}
字数:0/${maxCommentLength}
该邮箱地址仅用于接收其他用户的回复提醒,不会泄露