반응형
프로젝트를 진행 중.
접속한 사용자의 IP를 구하는 경우가 있었고.
그때를 기억하며 소스를 정리.
여기에 사용된 총 기술은 뒤로 나열하고.
소스 내용.
/** * Client IP를 구한다. * * @param request HttpServletRequest 객체 * @return String 실제 사용자 IP * */ public static String getClientIp(final HttpServletRequest request) { String clientIp = ServiceConst.STRING_EMPTY; clientIp = request.getHeader("IPV6_ADR"); if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getHeader("X-Forwarded-For"); } if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getHeader("Proxy-Client-IP"); } if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getHeader("WL-Proxy-Client-IP"); } if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getHeader("HTTP_CLIENT_IP"); } if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getHeader("HTTP_X_FORWARDED_FOR"); } if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getHeader("HTTP_X_FORWARDED"); } if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getHeader("HTTP_FORWARDED_FOR"); } if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getHeader("HTTP_FORWARDED"); } if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getHeader("HTTP_VIA"); } if( Strings.isNullOrEmpty(clientIp) || "unknown".equalsIgnoreCase(clientIp) ) { clientIp = request.getRemoteAddr(); } return clientIp; }
테스트 소스.
@Test void testGetClientIp() { MockHttpServletRequest request = new MockHttpServletRequest(); String clientIP = ServiceUtils.getClientIp(request); assertEquals("127.0.0.1", clientIP); }
결과.
기타.
자주 사용하는 상수만 따로 모아놓은 클래스를 관리하고.
guava를 이용해서 문자열에 대한 Null 체크하고.(아래)
참고 : https://github.com/google/guava
테스트 Request의 대한 요청을 위해서 Mock Request를 사용.(아래)
총평.
기타에서 정리할 내용이 더 많아졌다.
반응형
'프로그래밍이야기 > Java' 카테고리의 다른 글
[객체지향] OCP 적용 정리 (0) | 2022.01.23 |
---|---|
[Item6] 불필요한 객체를 생성하지 마라 (0) | 2022.01.05 |
[Java] Enum의 활용 (0) | 2020.05.22 |
[Java] Charset과 유니코드 그리고 인코딩 (0) | 2020.05.20 |
[Java] 상수(Const)를 선언하자 (0) | 2020.05.15 |
댓글