본문 바로가기
프로그래밍이야기/Java

[Java] 접속한 IP를 구해보자

by 사랑꾼이야 2020. 5. 12.
반응형

프로젝트를 진행 중. 

접속한 사용자의 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를 사용.(아래)

참고 : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/mock/web/MockHttpServletRequest.html


총평.

기타에서 정리할 내용이 더 많아졌다.

반응형

댓글