11package life .mosu .mosuserver .global .util ;
22
33import jakarta .servlet .http .HttpServletRequest ;
4- import java .net .InetAddress ;
5- import java .net .UnknownHostException ;
4+ import java .util .List ;
5+ import java .util .Arrays ;
6+ import java .util .stream .Stream ;
7+
8+ import lombok .Getter ;
9+ import lombok .RequiredArgsConstructor ;
610import lombok .experimental .UtilityClass ;
711
812@ UtilityClass
913public class IpUtil {
1014
11- public static String getClientIp (HttpServletRequest request ) throws UnknownHostException {
12- String ip = request .getHeader ("X-Forwarded-For" );
15+ private static final List <String > IP_HEADERS = Arrays .asList (
16+ "X-Forwarded-For" ,
17+ "Proxy-Client-IP" ,
18+ "WL-Proxy-Client-IP" ,
19+ "HTTP_CLIENT_IP" ,
20+ "HTTP_X_FORWARDED_FOR" ,
21+ "X-Real-IP"
22+ );
23+
24+ public static String getClientIp (HttpServletRequest request ) {
25+ String ip = IP_HEADERS .stream ()
26+ .map (request ::getHeader )
27+ .filter (IpUtil ::isValidIp )
28+ .findFirst ()
29+ .orElse (request .getRemoteAddr ());
30+
31+ String proxiedIp = resolveProxiedIp (ip );
32+ return Loopback .resolve (proxiedIp );
33+ }
1334
35+ private static String resolveProxiedIp (String ip ) {
1436 if (ip != null && ip .contains ("," )) {
15- ip = ip .split ("," )[0 ].trim ();
37+ return ip .split ("," )[0 ].trim ();
1638 }
39+ return ip ;
40+ }
1741
18- if (isInvalidIp (ip )) {
19- ip = request .getHeader ("Proxy-Client-IP" );
20- }
21- if (isInvalidIp (ip )) {
22- ip = request .getHeader ("WL-Proxy-Client-IP" );
23- }
24- if (isInvalidIp (ip )) {
25- ip = request .getHeader ("HTTP_CLIENT_IP" );
26- }
27- if (isInvalidIp (ip )) {
28- ip = request .getHeader ("HTTP_X_FORWARDED_FOR" );
29- }
30- if (isInvalidIp (ip )) {
31- ip = request .getHeader ("X-Real-IP" );
32- }
33- if (isInvalidIp (ip )) {
34- ip = request .getRemoteAddr ();
35- }
42+ private static boolean isValidIp (String ip ) {
43+ return ip != null && !ip .isEmpty () && !"unknown" .equalsIgnoreCase (ip );
44+ }
3645
37- if ("127.0.0.1" .equals (ip ) || "0:0:0:0:0:0:0:1" .equals (ip )) {
38- InetAddress inetAddress = InetAddress .getLocalHost ();
39- ip = inetAddress .getHostName () + "/" + inetAddress .getHostAddress ();
40- }
46+ @ RequiredArgsConstructor
47+ @ Getter
48+ private enum Loopback {
49+ V4 ("127.0.0.1" ),
50+ V6 ("0:0:0:0:0:0:0:1" );
4151
42- return ip ;
43- }
52+ private final String address ;
4453
45- private static boolean isInvalidIp (String ip ) {
46- return ip == null || ip .length () == 0 || "unknown" .equalsIgnoreCase (ip );
54+ public static boolean isLoopback (String ip ) {
55+ return Arrays .stream (Loopback .values ())
56+ .anyMatch (loopback -> loopback .getAddress ().equals (ip ));
57+ }
58+ public static String resolve (String ip ) {
59+ return isLoopback (ip ) ? "localhost" : ip ;
60+ }
4761 }
4862}
0 commit comments