LiiuZeYu_branch
lzy 9 months ago
parent 8c83805490
commit 089bb1f584

@ -0,0 +1,67 @@
/*
* Copyright (c) 2018-2999 广 All rights reserved.
*
* https://www.mall4j.com/
*
*
*
*
*/
package com.yami.shop.common.util;
// 导入Servlet相关的用于操作HTTP请求的类后续用于获取请求头以及客户端IP地址等信息
import jakarta.servlet.http.HttpServletRequest;
/**
* IpHelperIP
* IP
* IP
* IPIP
*
* @author lanhai
*/
public class IpHelper {
// 定义一个表示未知IP地址的常量字符串用于后续判断请求头中获取到的IP地址是否有效
private static final String UNKNOWN = "unknown";
/**
* IPIP
* "x-forwarded-for"IPIP
* IP0"unknown""Proxy-Client-IP"
* "WL-Proxy-Client-IP"
* IPRemoteAddrIP
* IPIPIPIP
*
* @return String IPnull
*/
public static String getIpAddr() {
// 通过HttpContextUtils工具类获取当前线程绑定的HttpServletRequest对象该对象包含了请求相关的各种信息
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
// 如果获取到的HttpServletRequest对象为null说明无法获取到请求上下文相关信息直接返回null无法获取IP地址
if (request == null) {
return null;
}
// 首先尝试从"x-forwarded-for"请求头获取IP地址该请求头在经过代理服务器转发时可能包含客户端真实IP
String ip = request.getHeader("x-forwarded-for");
// 如果获取到的IP地址为空、长度为0或者等于表示未知的字符串不区分大小写比较则继续尝试从其他请求头获取
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
// 如果从"Proxy-Client-IP"请求头获取到的IP地址仍不符合要求为空、长度为0或者是未知字符串则再尝试从"WL-Proxy-Client-IP"请求头获取
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
// 如果经过前面的尝试还是没有获取到有效IP地址则直接获取请求的远程地址RemoteAddr作为IP地址这是最基本的获取客户端IP的方式
if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 将获取到的IP地址字符串按照逗号进行分割因为可能存在经过多层代理IP地址有多个的情况以逗号分隔
String[] ips = ip.split(",");
// 返回分割后的第一个IP地址去除两端的空白字符作为客户端的真实IP地址如果只有一个IP则就是该IP本身
return ips[0].trim();
}
}
Loading…
Cancel
Save