java IP 주소 가져오기 예시

2271 단어 javaip
리버스 프록시 소프트웨어를 사용하는 경우http://192.168.1.110:2046/에 대한 URL 리버스 프록시http://www.xxx.com/의 URL을 사용할 때 request를 사용합니다.getRemoteAddr() 메서드에서 가져온 IP 주소는 클라이언트의 실제 IP가 아닌 127.0.0.1 또는 192.168.110입니다.
에이전트를 거친 후에 클라이언트와 서비스 사이에 중간층이 증가하기 때문에 서버는 클라이언트의 IP를 직접 받을 수 없고 서버 측 응용 프로그램도 요청된 주소를 전송하여 클라이언트에게 직접 되돌릴 수 없다.그러나 요청된 HTTP 헤더 정보에 X - FORWARDED - FOR 정보가 추가되었습니다.기존 클라이언트 IP 주소와 원래 클라이언트가 요청한 서버 주소를 추적합니다.우리가 방문할 때http://www.xxx.com/index.jsp/때, 사실은 우리 브라우저가 서버의 index에 진정으로 접근한 것이 아니다.jsp 파일이 아니라 프록시 서버에서 접근합니다http://192.168.1.110:2046/index.jsp프록시 서버는 인덱스에 접근하기 위해 접근한 결과를 브라우저에 되돌려줍니다.jsp의, 그래서 index.jsp에서 request를 통과합니다.getRemoteAddr() 방법으로 얻은 IP는 실제로 프록시 서버의 주소이며 클라이언트의 IP 주소가 아닙니다.
따라서 클라이언트의 실제 IP 주소를 얻을 수 있는 방법 1:

public String getRemortIP(HttpServletRequest request) {
  if (request.getHeader("x-forwarded-for") == null) {
   return request.getRemoteAddr();
  }
  return request.getHeader("x-forwarded-for");
 }
그런데 제가 방문할 때.http://www.xxx.com/index.jsp/반환된 IP 주소는 항상 unknown이며 위에서 설명한 127.0.1 또는 192.168.110이 아닙니다.http://192.168.1.110:2046/index.jsp클라이언트의 실제 IP 주소로 돌아가 검증할 수 있는 방법을 썼습니다.원인은 스쿼드에서 나온다.squid.conf 파일 forwarded_for 항목은 기본적으로 on입니다. forwarded_for는 off로 설정되었습니다. X-Forwarded-For: unknown은 클라이언트의 실제 IP 주소를 얻을 수 있는 방법 2:

public String getIpAddr(HttpServletRequest request) {

  String ip = request.getHeader("x-forwarded-for");
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
   ip = request.getHeader("Proxy-Client-IP");
  }
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
   ip = request.getHeader("WL-Proxy-Client-IP");
  }
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
   ip = request.getRemoteAddr();
  }
  return ip;
 }

그러나 만약에 다단계 역방향 에이전트를 통과한다면 X-Forwarded-For의 값은 하나가 아니라 일련의 Ip값이다. 도대체 어느 것이 진정한 사용자 측의 실제 IP일까?
정답은 X-Forwarded-For 중 첫 번째 알 수 없는 유효한 IP 문자열을 찾는 것입니다.
예:

X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
사용자의 실제 IP: 192.168.1.110

좋은 웹페이지 즐겨찾기