환경: jdk1.8 + idea2019.3 + Windows10
1단계:프로젝트 개발 시 매일 작업 로그를 처리할 때 사용자 작업 로그는 기본적으로 aop를 통해 구현됩니다. 측면에서 기록하지만 작업 로그를 기록할 때 기본적으로 참고용으로 기록되는 항목이 하나 있어야 하는데, 이는 운영자의 클라이언트 IP 주소이므로 향후 "더티"를 확인하는 것도 편리합니다. ㅋㅋㅋ 그래서 문제가 발생합니다. 클라이언트의 IP 주소를 구체적으로 어떻게 얻나요? 하하하, 이것이 이번 호에서 제가 가르치는 내용입니다. 몇몇 친구들이 그것을 얻는 방법을 알고 있다면 칭찬하고 싶지만 구현 아이디어가 저와 다른가요? 따라서 벌레 박테리아가 어떻게 구현되는지 확인할 수도 있습니다.
다음으로 가르치기 시작하겠습니다. 잘 들어야 합니다.
3. 클라이언트 IP를 얻기 위한 Java 구현
먼저 IP 관련 메서드 클래스를 캡슐화하는 데 사용되는 도구 클래스를 정의해 보겠습니다. package com.example.review.util;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
/**
* ip相关工具类
*
* @Author luoYong
* @Date 2022-03-30 17:16
*/
public class IpUtils {
}
이것이 이 튜토리얼의 핵심입니다. 클라이언트 IP를 얻는 방법은 무엇입니까? 더 이상 팔지 않겠습니다. ㅋㅋㅋ > request.getRemoteAddr()을 통해 획득 getRemoteAddr()은 더 이상 클라이언트의 실제 IP 주소를 획득할 수 없습니다.获 상담원 추가 후 왜 못받나요? 이는 클라이언트와 서비스 사이에 중간 프록시가 추가되어 서버가 클라이언트의 IP 주소를 직접 얻을 수 없고, 서버 측 애플리케이션이 요청 주소를 전달하여 클라이언트에 직접 반환할 수 없기 때문입니다. 직접 획득하는 방법이 통과되었습니다.
그래도 이해가 안 되신다면 아래 에이전시 프로세스 다이어그램을 보시면 이해가 되실 겁니다.
시스템만 제한하고 프록시 역할을 하지 않는다면 괜찮습니다. 시스템이 에이전트 역할을 하지 않는 것은 기본적으로 불가능합니다. 그러면 어떻게 해야 할까요? 걱정하지 마세요. 제가 플레이하는 방법을 알려드릴 테니 제 교수법을 사용해도 여전히 이해가 안 되시면 와서 저를 때려주세요. 다음은 클라이언트 IP를 얻기 위한 특정 메서드 클래스입니다. 참고용으로만 사용하세요./*** * 获取客户端ip地址 * @param request */ public static String getIP(final HttpServletRequest request) throws Exception { if (request == null) { throw (new Exception("getIpAddr method HttpServletRequest Object is null")); } String ipStr = request.getHeader("x-forwarded-for"); if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getRemoteAddr(); } // 多个路由时,取第一个非unknown的ip final String[] arr = ipStr.split(","); for (final String str : arr) { if (!"unknown".equalsIgnoreCase(str)) { ipStr = str; break; } } //目的是将localhost访问对应的ip 0:0:0:0:0:0:0:1 转成 127.0.0.1。 return ipStr.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipStr; }로컬에서 개발할 때는 기본적으로 인터페이스 액세스를 위해 [localhost] 표준 호스트 이름을 사용한다는 점을 기억해야 합니다. 그러면 데이터베이스 기록 로그 ip 열에 ips가 있다는 것이 밝혀졌습니다. 0:0:0:0:0:0:0:1이 됩니다. 획득한 IP는 왜 이럴까요? 이는 0:0:0:0:0:0:0:1이 [ipv6]의 표현이고 이는 로컬 시스템인 [ipv4]의 127.0.0.1과 동일하기 때문입니다. 그래서 결국 삼안연산을 통해 ipv6 주소를 ipv4 주소로 강제 변환했습니다. 모두가 이것을 이해할 수 있습니까? 이해하지 못한다면 돌아가서 컴퓨터 네트워크를 수정하는 것이 불가능하지 않습니다. 다음은 로컬호스트와 실제 IP를 통한 인터페이스 접속 및 데이터베이스에 저장된 작업 로그 기록입니다.
첨부된 내용은 로컬 IP 데이터베이스의 스크린샷입니다:
위 내용은 Java에서 클라이언트의 IP 주소를 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!