자바 서버 클 라 이언 트 의 실제 IP 가 져 오기
nginx 설정
우선, 하나의 요청 은 요청 헤더 와 요청 체 로 나 눌 수 있 고 우리 클 라 이언 트 의 IP 주소 정 보 는 일반적으로 요청 헤더 에 저 장 됩 니 다.서버 가 Nginx 로 부하 균형 을 맞 추 려 면 location 에
X-Real-IP
와 X-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_for
를 X-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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.