Spring Boot가 IP 주소 확인을 신속하게 구현하는 방법
소개:
로컬 IP 해상도를 사용하는 경우 ip2region을 사용합니다. 이 프로젝트는 보다 자세한 로컬 IP 주소 대응 테이블을 유지 관리합니다. 오프라인 환경에서 사용하려면 프로젝트 종속성을 가져와서 지정해야 합니다. 버전마다 방법이 다를 수 있습니다.
<!-- ip库--> <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>2.6.3</version> </dependency>
개발:
사용시 xdb 파일을 프로젝트 파일 디렉터리에 다운로드해야 합니다. ip2region을 사용하여 xdb 파일을 기반으로 완전히 쿼리하더라도 단일 쿼리의 응답 시간은 10 수준입니다. 다음 두 가지 방법으로 열 수 있습니다. 메모리 가속 쿼리:
vIndex 인덱스 캐시: 고정 512KiB 메모리 공간을 사용하여 벡터 인덱스 데이터를 캐시하고 1개의 IO 디스크 작업을 줄이며 평균 쿼리 효율성을 안정적으로 유지합니다. 10~20마이크로초.
xdb 전체 파일 캐시: 전체 xdb 파일을 메모리에 로드합니다. 메모리 공간은 xdb 파일 크기와 동일하며 마이크로초 수준의 쿼리 효율성을 유지하는 디스크 IO 작업이 필요하지 않습니다.
/** * ip查询 */ @Slf4j public class IPUtil { private static final String UNKNOWN = "unknown"; protected IPUtil(){ } /** * 获取 IP地址 * 使用 Nginx等反向代理软件, 则不能通过 request.getRemoteAddr()获取 IP地址 * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址, * X-Forwarded-For中第一个非 unknown的有效IP字符串,则为真实IP地址 */ public static 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 "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; } public static String getAddr(String ip){ String dbPath = "src/main/resources/ip2region/ip2region.xdb"; // 1、从 dbPath 加载整个 xdb 到内存。 byte[] cBuff; try { cBuff = Searcher.loadContentFromFile(dbPath); } catch (Exception e) { log.info("failed to load content from `%s`: %s\n", dbPath, e); return null; } // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 Searcher searcher; try { searcher = Searcher.newWithBuffer(cBuff); } catch (Exception e) { log.info("failed to create content cached searcher: %s\n", e); return null; } // 3、查询 try { String region = searcher.searchByStr(ip); return region; } catch (Exception e) { log.info("failed to search(%s): %s\n", ip, e); } return null; }
여기에서는 IP를 얻는 두 가지 방법과 IP 주소 확인을 포함하여 IP 확인을 도구 클래스로 캡슐화합니다. IP를 얻은 후에는 해당 IP를 기반으로 xdb에서 해당 IP 주소의 해상도를 찾아야 합니다. 로컬 데이터베이스에는 특정 결함이 있을 수 있으므로 일부 IP는 확인할 수 없습니다.
온라인 분석:
더 포괄적인 IP 주소 정보를 얻으려면 온라인 데이터베이스를 사용할 수 있습니다. 여기서 제공되는 것은 whois.pconline.com의 IP 분석입니다. 이 IP 분석은 제가 사용하는 동안 매우 원활하게 수행되었습니다. 일부 IP만 확인할 수 없습니다.
@Slf4j public class AddressUtils { // IP地址查询 public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; // 未知地址 public static final String UNKNOWN = "XX XX"; public static String getRealAddressByIP(String ip) { String address = UNKNOWN; // 内网不查询 if (IpUtils.internalIp(ip)) { return "内网IP"; } if (true) { try { String rspStr = sendGet(IP_URL, "ip=" + ip + "&json=true" ,"GBK"); if (StrUtil.isEmpty(rspStr)) { log.error("获取地理位置异常 {}" , ip); return UNKNOWN; } JSONObject obj = JSONObject.parseObject(rspStr); String region = obj.getString("pro"); String city = obj.getString("city"); return String.format("%s %s" , region, city); } catch (Exception e) { log.error("获取地理位置异常 {}" , ip); } } return address; } public static String sendGet(String url, String param, String contentType) { StringBuilder result = new StringBuilder(); BufferedReader in = null; try { String urlNameString = url + "?" + param; log.info("sendGet - {}" , urlNameString); URL realUrl = new URL(urlNameString); URLConnection connection = realUrl.openConnection(); connection.setRequestProperty("accept" , "*/*"); connection.setRequestProperty("connection" , "Keep-Alive"); connection.setRequestProperty("user-agent" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); connection.connect(); in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); String line; while ((line = in.readLine()) != null) { result.append(line); } log.info("recv - {}" , result); } catch (ConnectException e) { log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); } catch (SocketTimeoutException e) { log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); } catch (IOException e) { log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); } catch (Exception e) { log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); } finally { try { if (in != null) { in.close(); } } catch (Exception ex) { log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); } } return result.toString(); } }
시나리오:
그러면 어떤 개발 과정에서 IP 주소를 얻는 것이 더 적절합니까? 여기서 인터셉터가 사용됩니다. 서비스에 들어오는 모든 요청을 차단하고 사전 작업을 수행하며, 진입 시 요청 헤더 파싱, IP 획득, IP 주소 확인을 완료하여 IP 주소 등의 정보가 모든 후속 프로세스에서 재사용될 수 있도록 합니다.
rreee/** * 对ip 进行限制,防止IP大量请求 */ @Slf4j @Configuration public class IpUrlLimitInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) { //更新全局变量 Constant.IP = IPUtil.getIpAddr(httpServletRequest); Constant.IP_ADDR = AddressUtils.getRealAddressByIP(Constant.IP); Constant.URL = httpServletRequest.getRequestURI(); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) { //通过本地获取 // 获得ip // String ip = IPUtil.getIpAddr(httpServletRequest); //解析具体地址 // String addr = IPUtil.getAddr(ip); //通过在线库获取 // String ip = IpUtils.getIpAddr(httpServletRequest); // String ipaddr = AddressUtils.getRealAddressByIP(ipAddr); // log.info("IP >> {},Address >> {}",ip,ipaddr); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { } }
如果想要执行我们的ip 解析拦截器,需要在spring boot的视图层进行拦截才会触发我们的拦截器。
@Configuration public class WebConfig implements WebMvcConfigurer { @Autowired IpUrlLimitInterceptor ipUrlLimitInterceptor; //执行ip拦截器 @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(ipUrlLimitInterceptor) // 拦截所有请求 .addPathPatterns("/**"); } }
위 내용은 Spring Boot가 IP 주소 확인을 신속하게 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Xiaohongshu는 사용자가 일상을 공유하고 좋아하는 제품을 발견할 수 있는 인기 있는 소셜 전자상거래 플랫폼입니다. 일부 사용자는 개인 정보 보호에 더 민감하며 온라인 개인 정보 보호를 위해 자신의 IP 주소가 Xiaohongshu에 표시되지 않기를 바랍니다. 그렇다면 Xiaohongshu가 IP 주소를 표시하지 않도록 설정하는 방법은 무엇입니까? 이 기사에서는 이 질문에 대해 자세히 답변할 것입니다. 1. Xiaohongshu가 IP 주소를 표시하지 않도록 설정하는 방법은 무엇입니까? 1. Xiaohongshu 설정 수정: Xiaohongshu 앱을 열고 오른쪽 하단에 있는 "나"를 클릭하여 개인 센터에 들어갑니다. 그런 다음 아바타를 클릭하여 계정 설정으로 들어갑니다. 계정 설정에서 "개인정보 설정"을 찾아 클릭하여 들어갑니다. 여기에서 IP 주소에 대한 설정 옵션을 찾을 수 있습니다. 이 옵션을 끄시면 됩니다. 2. 캐시 지우기: 때때로 Xiaohongshu에서 오류가 표시될 수 있습니다.

때때로 모든 사람이 IP 주소를 수동으로 수정해야 하는 경우가 있지만 일부 Windows 10 고객은 IP 주소를 설정한 후에 저장할 수 없다고 보고합니다. 이 상황을 해결하는 방법은 무엇입니까? IP 주소를 입력하는 중 오류가 발생하여 기본적으로 IP 주소가 저장됩니다. 서브넷 마스크와 함께 서브넷 접두사가 작성되었는지 확인할 수 있습니다. 그렇다면 변경 후 정상적으로 저장하면 됩니다. IP 주소. Windows 10 IP 주소를 설정한 후 저장할 수 없는 문제를 해결하는 방법: 오류 그림은 다음과 같습니다. 오류입니다. 그림과 같이 서브넷 마스크가 아닌 서브넷 접두사 길이입니다. 위 그림과 같이 실제로 많은 사용자들이 서브넷 접두어를 서브넷 마스크로 기재해 두는 경우가 많습니다.

Xiaomi 휴대폰의 IP 주소는 어디에 있습니까? Xiaomi 휴대폰에서 IP 주소를 확인할 수 있지만 대부분의 사용자는 IP 주소를 확인할 수 있는 곳을 모릅니다. 다음은 Xiaomi 모바일의 IP 주소를 확인하는 방법에 대한 그래픽 튜토리얼입니다. 에디터가 가져온 폰. 관심있는 분들은 오셔서 구경해보세요! Xiaomi 휴대폰의 IP 주소는 어디에 있습니까? 1. 먼저 Xiaomi 휴대폰에서 설정 기능을 열고 [내 장치]를 클릭하여 들어갑니다. 2. 그런 다음 내 장치 기능 페이지에서 [모든 매개변수] 서비스를 클릭합니다. 그런 다음 모든 매개변수 페이지에서 아래쪽으로 슬라이드하여 [상태 정보]를 선택합니다. 4. 마지막으로 상태 정보 인터페이스에서 IP 주소를 볼 수 있습니다.

Xianyu는 매우 실용적인 중고 거래 플랫폼입니다. 여기서 우리는 다양한 제품을 구매하고 우리 자신의 유휴 품목을 판매할 수 있습니다. 아래 에디터와 함께 살펴보시죠! Xianyu IP 주소 수정 방법을 공유하세요. 먼저 Xianyu 소프트웨어를 열면 왼쪽 상단에 해산물 시장, 추천, 주소 및 기타 옵션이 표시됩니다. 2. 그런 다음 주소 페이지에서 주소 옆에 있는 [아래쪽 화살표]를 클릭합니다. 3. 마지막 클릭 후 도시 선택 페이지에서 도시를 클릭합니다.

사용자들은 Douyin을 통해 자신의 삶을 공유하고, 자신의 재능을 뽐내며, 전국은 물론 전 세계 네티즌들과 소통합니다. 일부 사용자는 개인 정보 보호 또는 지리적 제한과 같은 이유로 Douyin에서 IP 주소를 변경하기를 원합니다. 그렇다면 Douyin IP 주소는 어떻게 위치를 변경합니까? 1. Douyin IP 주소의 위치를 변경하는 방법은 무엇입니까? 프록시 서버는 사용자 요청을 인터넷으로 전달하고 응답을 반환하는 데 사용되는 중개 서비스입니다. 프록시 서버를 구성하면 사용자는 실제 IP 주소를 숨기고 IP 주소를 변경할 수 있습니다. 이 접근 방식은 사용자 개인 정보를 보호하고 네트워크 보안을 향상시키는 데 도움이 됩니다. 프록시 서버를 사용하여 제한된 콘텐츠에 액세스하거나 지리적 위치 제한을 우회할 수도 있습니다. 전반적으로 프록시 서버를 사용하는 것은 사용자가 인터넷을 보다 안전하고 자유롭게 탐색하는 데 도움이 되는 실용적인 네트워크 도구입니다.

Springboot가 파일을 읽지만 jar 패키지로 패키징한 후 최신 개발에 액세스할 수 없습니다. springboot가 파일을 jar 패키지로 패키징한 후 파일을 읽을 수 없는 상황이 발생합니다. 그 이유는 패키징 후 파일의 가상 경로 때문입니다. 유효하지 않으며 읽기를 통해서만 액세스할 수 있습니다. 파일은 리소스 publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input 아래에 있습니다.

인터넷의 급속한 발전으로 인해 IP 주소는 네트워크 통신에 없어서는 안 될 부분이 되었습니다. IP 주소 정보는 네트워크 보안 모니터링, 트래픽 관리, 타겟 전자상거래 광고에서 매우 중요합니다. 따라서 사용자가 IP 주소/도메인 이름 정보를 쉽게 조회할 수 있도록 많은 웹사이트에서는 IP 주소 조회 기능을 제공합니다. 이 기사에서는 독자의 참고를 위해 PHP를 사용하여 IP 주소 쿼리 기능을 구현하는 방법을 소개합니다. 1. IP 주소란 무엇입니까? IP 주소(InternetProtocolAddress)는 네트워크 프로토콜입니다.

비트코인 거래 IP 주소 비트코인 거래 IP 주소는 비트코인 거래 시스템의 필수적이고 중요한 구성 요소입니다. 비트코인 거래자가 비트코인 거래를 수행할 수 있는 비트코인 거래 플랫폼의 핵심입니다. 비트코인 거래 IP 주소는 비트코인 거래 시스템의 기초이자 비트코인 거래자가 비트코인 거래를 수행할 수 있는 기초입니다. 비트코인 거래 IP 주소는 비트코인 거래 시스템의 서버와 거래자의 장치를 찾는 데 사용되는 글로벌 네트워크 주소입니다. 비트코인 거래 IP 주소를 조회하면 거래 현황 및 관련 정보를 얻을 수 있습니다. 또한, 비트코인 거래 IP 주소는 클라이언트를 비트코인 거래 시스템 및 거래자의 장치에 연결하는 데에도 사용될 수 있습니다. 비트코인 거래 IP 주소는 공개되어 있나요? 비트코인 거래 IP 주소는 공개되지 않습니다.
