자바 서버 클 라 이언 트 의 실제 IP 가 져 오기

9479 단어
작은 게임 개발 을 진행 할 때 우리 가 비교적 주목 하 는 기능 중 하 나 는 바로 공유 이다.저 희 는 각 도시 나 지역 에 따라 서로 다른 문서 공유, 지역 식별 기능 이 서버 에서 이 루어 지면 클 라 이언 트 의 실제 IP 를 알 아야 합 니 다.오늘 은 서버 가 클 라 이언 트 의 실제 IP 를 어떻게 얻 었 는 지 살 펴 보 겠 습 니 다.
nginx 설정
우선, 하나의 요청 은 요청 헤더 와 요청 체 로 나 눌 수 있 고 우리 클 라 이언 트 의 IP 주소 정 보 는 일반적으로 요청 헤더 에 저 장 됩 니 다.서버 가 Nginx 로 부하 균형 을 맞 추 려 면 location 에 X-Real-IPX-Forwarded-For 요청 헤드 를 설정 해 야 합 니 다.
        location ^~ /your-service/ {	
                proxy_set_header        X-Real-IP       $remote_addr;	
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;	
                proxy_pass http://localhost:60000/your-service/;	
        }

X-Real-IP
에서 이런 말 이 있다.
       ,       web           ,  web             ip,  $remote_addr               ip  。

이 말 은 nginx 역방향 서버 를 사용 한 후에 웹 에서 request.getRemoteAddr() (본질 적 으로 가 져 오기 $remote_addr 를 사용 하고 nginx 의 주 소 를 얻 었 습 니 다. 즉, $remote_addr 변수 에 포 장 된 것 은 nginx 의 주 소 를 얻 었 습 니 다. 물론 사용자 의 실제 ip 을 얻 을 수 없습니다.그러나 nginx 는 사용자 의 실제 ip 을 얻 을 수 있 습 니 다. 즉, nginx 가 $remote_addr 변 수 를 사용 할 때 사용자 의 실제 ip 을 얻 을 수 있 습 니 다. 만약 에 저희 가 웹 에서 사용자 의 실제 ip 을 얻 으 려 면 nginx 에서 할당 작업 을 해 야 합 니 다. 즉, 제 가 위 에 있 는 설정 입 니 다.
proxy_set_header        X-Real-IP       $remote_addr;

X-Forwarded-For X-Forwarded-For 변 수 는 squid 가 개발 한 것 입 니 다. HTTP 프 록 시 나 부하 분산 기 원시 IP 를 통 해 웹 서버 에 연 결 된 클 라 이언 트 주 소 를 식별 하 는 비 rfc 기준 입 니 다. X-Forwarded-For 설정 이 있 으 면 proxy 퍼 가기 를 거 칠 때마다 기록 되 어 있 습 니 다. 형식 은 client1,proxy1,proxy2 쉼표 로 각 주 소 를 분리 하 는 것 입 니 다. rfc 기준 이 아니 기 때문에 기본적으로 없습니다.강제 추가 가 필요 합 니 다.기본 적 인 상황 에서 proxy 퍼 가기 요청 을 통 해 백 엔 드 에서 원 격 주 소 는 proxy 엔 드 의 ip 입 니 다.즉, 기본 적 인 상황 에서 저 희 는 request.getAttribute("X-Forwarded-For") 을 사용 하여 사용자 의 ip 을 얻 을 수 없습니다. 만약 에 이 변 수 를 통 해 사용자 의 ip 을 얻 으 려 면 저 희 는 nginx 에 설정 을 추가 해 야 합 니 다.
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

덮어 쓰 는 것 이 아니 라 하나 $proxy_add_x_forwarded_forX-Forwarded-For 에 추가 한 다 는 뜻 입 니 다. 덮어 쓰 는 것 이 주의 하 십시오. 물론 기본 X-Forwarded-For 값 이 비어 있 기 때문에 우 리 는 항상 X-Forwarded-For 값 이 $proxy_add_x_forwarded_for 값 과 같다 고 생각 합 니 다. 실제로 nginx 두 대 를 서로 다른 ip 에 구축 하고 이 설정 을 사용 하면 웹 서버 에서 request.getAttribute("X-Forwarded-For") 를 통과 하 는 것 을 발견 할 수 있 습 니 다.클 라 이언 트 ip 와 첫 번 째 nginx ip 를 얻 을 수 있 습 니 다.
그럼 $proxy_add_x_forwarded_for 은 또 뭐 예요?$proxy_add_x_forwarded_for 변 수 는 클 라 이언 트 요청 헤더 의 X-Forwarded-For$remote_addr 두 부분 을 포함 하고 그들 사 이 는 쉼표 로 분리 된다.
예 를 들 어 웹 애플 리 케 이 션 이 있 습 니 다. 그 전에 두 개의 nginx 를 통 해 리 트 윗 했 습 니 다. www.linuxidc.com 즉, 사용자 가 이 웹 을 방문 하여 두 대의 nginx 를 통 해 리 트 윗 했 습 니 다.
첫 번 째 nginx 에서 사용:
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

현재 $proxy_add_x_forwarded_for 변수의 X-Forwarded-For 부분 이 비어 있 기 때문에 $remote_addr 만 있 고 $remote_addr 의 값 은 사용자 의 ip 입 니 다. 그래서 값 을 부여 한 후에 X-Forwarded-For 변수의 값 은 사용자 의 실제 ip 주소 입 니 다.
두 번 째 nginx 에 도착 하면 사용:
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

현재 $proxy_add_x_forwarded_for 변 수 는 X-Forwarded-For 부분 에 사용자 의 실제 ip 이 포함 되 어 있 습 니 다. $remote_addr 부분의 값 은 이전 nginx 의 ip 주소 입 니 다. 그래서 이 할당 을 통 해 현재 X-Forwarded-For 의 값 은 '사용자 의 실제 ip, 첫 번 째 nginx 의 ip' 이 되 었 습 니 다. 이렇게 하면 알 수 있 습 니 다.
서버 에서 실제 IP 가 져 오기
코드:
  public static String getIpAddress(HttpServletRequest request) {	
    String Xip = request.getHeader("X-Real-IP");	
    String XFor = request.getHeader("X-Forwarded-For");	
    if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {	
      //           ip ,   ip    ip	
      int index = XFor.indexOf(",");	
      if (index != -1) {	
        return XFor.substring(0, index);	
      } else {	
        return XFor;	
      }	
    }	
    XFor = Xip;	
    if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {	
      return XFor;	
    }	
    if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {	
      XFor = request.getHeader("Proxy-Client-IP");	
    }	
    if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {	
      XFor = request.getHeader("WL-Proxy-Client-IP");	
    }	
    if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {	
      XFor = request.getHeader("HTTP_CLIENT_IP");	
    }	
    if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {	
      XFor = request.getHeader("HTTP_X_FORWARDED_FOR");	
    }	
    if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) {	
      XFor = request.getRemoteAddr();	
    }	
    return XFor;	
  }

각 요청 헤드 의 의 미 를 살 펴 보 겠 습 니 다.
X-Real-IP
nginx 대 리 는 일반적으로 이 요청 헤드 를 추가 합 니 다.
X-FORWARDED-FOR
이것 은 Squid 개 발 된 필드 로 HTTP 프 록 시 나 부하 균형 서버 를 통과 할 때 만 추가 할 수 있 습 니 다.
프 록 시 - 클 린 트 - IP 와 WL - 프 록 시 - 클 린 트 - IP
이것 은 일반적으로 apache http 서버 의 요청 을 거 쳐 야 있 습 니 다. apache http 로 프 록 시 를 할 때 보통 Proxy-Client-IP 요청 머리 를 추가 합 니 다. WL-Proxy-Client-IP 는 weblogic 플러그 인 에 추 가 된 머리 입 니 다.
HTTPCLIENTIP
일부 프 록 시 서버 에 이 요청 헤드 를 추가 합 니 다.인터넷 에서 검색 해 보 니 다음 과 같은 말 이 있 습 니 다.
      http header,       ,          。 	
curl -H 'client-ip: 8.8.8.8' lidian.club/phpinfo.php | grep _SERVER 	
      _SERVER["HTTP_CLIENT_IP"]  。 	
client-ip   client-host    NAPT        ,        http     ,       header,         ,      ,           。 	
(             x-forwarded-for) 	
      web proxy         header。 	
TCP/IP Illustrated Vol 3        header,        。 	
          2005 ,     Perl/CGI   (9784798010779,270 )   client-ip   via    header         。

HTTPXFORWARDED_FOR
XFF 헤드 라 고 부 릅 니 다. 클 라 이언 트, 즉 HTTP 요청 단의 실제 IP 입 니 다. HTTP 프 록 시 (예 를 들 어 APACHE 프 록 시) 나 부하 균형 서버 를 통과 할 때 만 이 항목 을 추가 합 니 다.RFC 에서 정의 하 는 표준 요청 헤더 정보 가 아 닙 니 다. squid 캐 시 프 록 시 개발 문서 에서 자세 한 설명 을 찾 을 수 있 습 니 다.이 메시지 가 있 으 면 프 록 시 서버 를 사 용 했 음 을 설명 합 니 다. 주 소 는 뒤의 수치 입 니 다.위조 가 가능 합 니 다.표준 형식 은 다음 과 같 습 니 다. X - Forward - For: client 1, proxy 1, proxy 2

좋은 웹페이지 즐겨찾기