자바 로 방문 자의 실제 IP 주 소 를 가 져 옵 니 다.
주요 설명
JSP 에서 클 라 이언 트 의 IP 주 소 를 가 져 오 는 방법 은 request.getRemoteAddr()입 니 다.이런 방법 은 대부분 상황 에서 유효 합 니 다.그러나 Apache,Squid 등 역방향 프 록 시 를 통 해 클 라 이언 트 의 실제 IP 주 소 를 얻 을 수 없습니다.역방향 프 록 시 소프트웨어 를 사용 하면 request.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 주소 가 아 닙 니 다.
(1)방법 1
따라서 클 라 이언 트 의 실제 IP 주 소 를 얻 는 방법 1:Public String getRemortIP(HttpServletRequest request){
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
(2)방법 2
클 라 이언 트 의 실제 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-Forward-For 의 값 은 하나 가 아니 라 IP 값 입 니 다.도대체 어느 것 이 진정한 사용자 측의 실제 IP 입 니까?
정 답 은 X-Forward-For 에서 최초 로 알 수 없 는 유효한 IP 문자열 을 가 져 오 는 것 입 니 다.예 를 들 어 X-Forward-For:192.168.1.110,192.168.1.120,192.168.1.130,192.168.1.100
사용자 의 실제 IP 는 192.168.1.110 입 니 다.
(3)방법 3.네티즌 코드 참조
import javax.servlet.http.HttpServletRequest; /** * * * IP * @author X-rapido * */ public class CusAccessObjectUtil { /** * IP , request.getRemoteAddr(); IP , * * , ,X-Forwarded-For , IP , IP ? * X-Forwarded-For unknown 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 * * @param request * @return */ public static String getIpAddress(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.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } }
/**
*포트 가 져 오기
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uri = request.getRequestURI();// String url = request.getRequestURL().toString();// url String ip = request.getRemoteAddr();// IP String params = request.getQueryString();// String host=request.getRemoteHost();// int port =request.getRemotePort();// 。 System.out.println(ip); System.out.println(url); System.out.println(uri); System.out.println(params); System.out.println(host); System.out.println(port);}
(4)네티즌 들 이 정리 한 몇 가지 방법:
/** * ip ( ) * * @param request * @return */ public static String getRemoteAddr(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.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } private static final String[] HEADERS_TO_TRY = { "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "REMOTE_ADDR", "X-Real-IP"}; /*** * ip ( ) * @param request * @return */ public static String getClientIpAddress(HttpServletRequest request) { for (String header : HEADERS_TO_TRY) { String ip = request.getHeader(header); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { return ip; } } return request.getRemoteAddr(); } /*** * ip ( ) * @param request * @return */ public static String getClientIpAddr(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.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_FORWARDED"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_VIA"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("REMOTE_ADDR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Real-IP"); if (null != ip && !"".equals(ip.trim()) && !"unknown".equalsIgnoreCase(ip)) { return ip; } ip = request.getHeader("X-Forwarded-For"); if (null != ip && !"".equals(ip.trim()) && !"unknown".equalsIgnoreCase(ip)) { // get first ip from proxy ip int index = ip.indexOf(','); if (index != -1) { return ip.substring(0, index); } else { return ip; } } return request.getRemoteAddr(); }
저 는 spring MVC 프레임 워 크 를 사 용 했 습 니 다.테스트 컨트롤 러 코드 는 다음 과 같 습 니 다.
package com.web.controller;import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.common.util.SystemHWUtil;import com.common.util.WebServletUtil;import com.string.widget.util.ValueWidget;import com.util.JSONPUtil;/*** * * @author huangweii * 2015 5 29 */@Controller@RequestMapping("/cors")public class CORSController { @ResponseBody @RequestMapping(value = "/simple",produces=SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF) public String corsJsonSimple(HttpServletRequest request,String callback){ String content; Map map=new HashMap(); map.put("username", " "); map.put("age", "27"); map.put("address", "beijing"); content=HWJacksonUtils.getJsonP(map, callback); System.out.println("getIpAddr:"+WebServletUtil.getIpAddr(request)); System.out.println("getRemoteAddr:"+WebServletUtil.getRemoteAddr(request)); System.out.println("getClientIpAddr:"+WebServletUtil.getClientIpAddr(request)); System.out.println("getClientIpAddress:"+WebServletUtil.getClientIpAddress(request)); return content; }}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.