클 라 이언 트 의 실제 IP 를 가 져 오 는 방법

12191 단어 자바
간단 한 소개
클 라 이언 트 의 IP 주 소 를 가 져 오 는 데 자주 사용 되 는 방법 은 request. getRemoteAddr () 입 니 다.그러나 아파 치, Nagix 등 리 버스 프 록 시 를 통과 하면 클 라 이언 트 의 실제 IP 를 얻 을 수 없다
4. 567917. 프 록 시 를 거 친 후에 클 라 이언 트 와 서비스 사이 에 중간 층 이 증가 하기 때문에 서버 는 클 라 이언 트 의 IP 를 직접 받 을 수 없고 서버 측 응용 도 요청 한 주 소 를 클 라 이언 트 에 게 직접 전달 할 수 없다.그러나 리 트 윗 요청 한 HTTP 헤드 메시지 에 X - FORWARDED - FOR 메시지 가 추가 됐다.기 존의 클 라 이언 트 IP 주소 와 원래 클 라 이언 트 가 요청 한 서버 주 소 를 추적 합 니 다
4. 567917. 예 를 들 어 역방향 대 리 를 사용 하면http://192.168.10.1:8081역방향 에이전트http://example.com이 경우 request. getRemoteAddr () 방법 으로 얻 은 IP 주 소 는 클 라 이언 트 의 실제 IP 가 아 닌 127.0.0.1 또는 192.168.10.1 입 니 다.방문http://example.com프 록 시 서버 접근http://192.168.10.1:8081따라서 request. getRemoteAddr () 가 가 져 온 IP 는 프 록 시 서버 의 IP 입 니 다
획득 방법
(1) 방법 1
public String getRemortIP(HttpServletRequest request) { 
  if (request.getHeader("x-forwarded-for") == null) { 
   return request.getRemoteAddr(); 
  } 
  return request.getHeader("x-forwarded-for"); 
 }

(2) 방법 2: squid. conf 의 배합 파일 forwardfor 항목 의 기본 값 은 on 입 니 다. forwardfor 설정 off: X - Forward - for: unknown
//equalsIgnoreCase            ,      。
//isBlank      、   0       
public String getIpAddr(HttpServletRequest request) { 
		String[] headers = ["x-forwarded-for","Proxy-Client-IP","WL-Proxy-Client-IP"]
       String ip = null;
       for(String header: headers){
           if(StringUtils.isBlank(addr) || "unknown".equalsIgnoreCase(ip)) { 
               ip = request.getHeader(header); 
           } 
      }
      if(StringUtils.isBlank(addr) || "unknown".equalsIgnoreCase(ip)) { 
           ip = request.getRemoteAddr(); 
       } 
       return ip; 
   }

(3) 다단 계 역방향 에이 전 트 를 사용 하면 X - Forward - for 의 값 이 하나 가 아니 라 IP 값 을 가 져 옵 니 다.
public static String getClientIP(HttpServletRequest request) {
		String[] headers = {"x-forwarded-for","Proxy-Client-IP","WL-Proxy-Client-IP"};
		String ip = null;
		for(String header: headers){
			if(StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader(header);
			}
		}
		if(StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
			if(ip.equals("127.0.0.1") || ip.equals("0:0:0:0:0:0:0:1")){
				//          IP
				InetAddress inet=null;
				try {
					inet = InetAddress.getLocalHost();
				} catch (UnknownHostException e) {
					e.printStackTrace();
				}
				ip= inet.getHostAddress();
			}
		}
		//if(ip.contains(","){
		if(StringUtils.isBlank(ip)){
			if(ip.indexOf(",")>0){
				ip= ip.substring(0,ip.indexOf(","));
			}
		}
		return ip;
	}

GO GO

좋은 웹페이지 즐겨찾기