【 기 록 】 방문 자의 실제 IP 획득

14249 단어 자바 레코드
장면 설명: 서버 측 이 클 라 이언 트 의 요청 을 받 을 때 보통 서명 검증, 클 라 이언 트 IP 한정 등 상황 이 필요 하고 클 라 이언 트 IP 제한 을 할 때 먼저 실제 IP 를 가 져 와 야 합 니 다.
ip 접근 은 일반적으로 두 가지 상황 으로 나 뉜 다.
방식 1. 클 라 이언 트 가 프 록 시 를 거치 지 않 고 서버 쪽 (nginx, squid, haproxy) 에 직접 접근 합 니 다.
방식 2. 클 라 이언 트 는 다단 계 프 록 시 를 통 해 최종 적 으로 서버 엔 드 (nginx, squid, haproxy) 에 도착 합 니 다.
클 라 이언 트 요청 정 보 는 모두 HttpServletRequest 에 포함 되 어 있 으 며, 방법 getRemoteAddr () 를 통 해 클 라 이언 트 IP 를 얻 을 수 있 습 니 다.
방식 의 한 형식 으로 이 클 라 이언 트 의 실제 IP 를 직접 얻 을 수 있 습 니 다.
방식 2 에서 프 록 시 형식 을 통 해 이 때 다단 계 역방향 대 리 를 통 해 방법 getRemoteAddr () 를 통 해 클 라 이언 트 의 실제 IP 를 얻 지 못 하고 x - forward - for 를 통 해 리 트 윗 후 요청 정 보 를 얻 을 수 있 습 니 다.클 라 이언 트 가 리 트 윗 을 요청 하면 IP 는 그 다음 에 추가 되 고 쉼표 로 분 리 됩 니 다. 예 를 들 어 10.47.103.13, 4.2.2.2, 10.96.12.230.
요청 중인 인자:
request.getHeader(“x-forwarded-for”) : 10.47.103.13,4.2.2.2,10.96.112.230
request.getHeader(“X-Real-IP”) : 10.47.103.13
request.getRemoteAddr():10.96.112.230
최종 정확 한 클 라 이언 트 정 보 는:
x - forward - for 가 비어 있 지 않 으 면 쉼표 앞의 첫 번 째 IP 입 니 다.X - Real - IP 가 비어 있 지 않 으 면 이 IP 입 니 다.그렇지 않 으 면 getRemoteAddr ();
요청 헤더 에 대한 설명:
X - Forward - for: 이것 은 Squid 가 개발 한 필드 입 니 다. HTTP 프 록 시 나 부하 균형 서버 를 통과 할 때 만 이 항목 을 추가 합 니 다.형식 은 X - Forward - for: client 1, proxy 1, proxy 2 입 니 다. 일반적인 상황 에서 첫 번 째 ip 은 클 라 이언 트 의 실제 ip 이 고 뒤의 프 록 시 서버 ip 입 니 다.현재 대부분의 대리 들 은 이 요청 헤드 를 추가 할 것 이다.
Proxy - client - IP / WL - Proxy - client - IP: 이것 은 보통 apache http 서버 의 요청 을 거 쳐 야 있 습 니 다. apache http 로 프 록 시 를 할 때 보통 Proxy - client - IP 요청 헤드 를 추가 합 니 다. WL - Proxy - client - IP 는 그의 weblogic 플러그 인 에 추 가 된 머리 입 니 다.HTTP_CLIENT_IP: 일부 프 록 시 서버 에 이 요청 헤드 를 추가 합 니 다.X - Real - IP: nginx 에이 전 트 는 일반적으로 이 요청 헤 더 를 추가 합 니 다.
/** 
     *       IP  ,   request.getRemoteAddr()                      IP  , 
     *   ,             ,X-Forwarded-For       ,    IP  
     */
    private String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for"); 
        System.out.println("x-forwarded-for ip: " + ip);
        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {  
            //            ip ,   ip    ip
            if( ip.indexOf(",")!=-1 ){
                ip = ip.split(",")[0];
            }
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("Proxy-Client-IP");  
            System.out.println("Proxy-Client-IP ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("WL-Proxy-Client-IP");  
            System.out.println("WL-Proxy-Client-IP ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_CLIENT_IP");  
            System.out.println("HTTP_CLIENT_IP ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
            System.out.println("HTTP_X_FORWARDED_FOR ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("X-Real-IP");  
            System.out.println("X-Real-IP ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getRemoteAddr();  
            System.out.println("getRemoteAddr ip: " + ip);
        } 
        System.out.println("     ip: " + ip);
        return ip;  
    }

좋은 웹페이지 즐겨찾기