JSP에서 클라이언트의 IP 주소를 얻는 방법은 다음과 같습니다. request.getRemoteaddr ()는 대부분의 경우 유효합니다. 그러나 Apache, Squid 및 기타 리버스 프록시 소프트웨어를 통과 한 후 클라이언트의 실제 IP 주소를 얻을 수 없습니다. 리버스 프록시 소프트웨어를 사용하는 경우 reques.getRemoteaddr () 메소드를 사용하여 얻은 IP 주소는 클라이언트의 실제 IP가 아니라 127.0.0.1 또는 192.168.1.110입니다.
프록시를 통과 한 후 클라이언트와 서비스 사이에 중간 계층이 추가되므로 서버는 클라이언트의 IP를 직접 얻을 수 없으며 서버 측 응용 프로그램은 전달 주소를 통해 클라이언트에게 직접 반환 할 수 없습니다. 그러나 요청을 전달하는 HTTP 헤더 정보에서 x-forwarded-for 정보가 추가됩니다. 원래 클라이언트 IP 주소와 원래 클라이언트가 요청한 서버 주소를 추적하는 데 사용됩니다. Index.jsp/에 액세스하면 브라우저가 실제로 서버의 index.jsp 파일에 액세스하는 것은 아닙니다. 대신 프록시 서버는 먼저 index.jsp에 액세스하고 프록시 서버는 액세스 한 결과를 브라우저에 반환합니다. 프록시 서버는 index.jsp에 액세스하므로 index.jsp의 request.getRemoteaddr () 메소드에서 얻은 IP는 실제로 클라이언트의 IP 주소가 아닌 프록시 서버의 주소입니다.
따라서 클라이언트의 실제 IP 주소를 얻는 방법을 얻을 수 있습니다.
공개 문자열 getRemortip (httpservletrequest request) {if (request.getheader ( "x-forwarded-for") == null) {return request.getRemoteaddr (); } return request.getheader ( "x-forwarded-for"); }방법 2 클라이언트의 실제 IP 주소를 얻으려면 :
public String getipaddr (httpservletrequest request) {문자열 ip = request.getheader ( "x-forwarded-for"); if (ip == null || ip.length () == 0 || "알 수없는".EqualSEndOreCase (ip)) {ip = request.getheader ( "proxy-client-ip"); } if (ip == null || ip.length () == 0 || "알 수없는".EqualSEndoreCase (ip)) {ip = request.getheader ( "wl-proxy-client-ip"); } if (ip == null || ip.length () == 0 || "알 수없는".EqualSeignoreCase (ip)) {ip = request.getRemoteaddr (); } 반환 IP; }그러나 다단계 리버스 프록시가 전달되면 x-forwarded의 값은 둘 이상이지만 일련의 IP 값이 있습니다. 실제 사용자 측의 실제 IP는 무엇입니까?
답은 최초의 비 unknown 유효한 IP 문자열을 x-forwarded-for로 가져가는 것입니다. 좋다:
x-forwarded-for : 192.168.1.110, 192.168.1.120, 192.168.130, 192.168.1.100
사용자의 실제 IP는 192.168.1.110입니다