前端獲取IP地址的方法總結(jié)
通過(guò)配置vite獲取IP地址
實(shí)現(xiàn)效果

實(shí)現(xiàn)方法
1、需要下載os插件
npm i os
2、獲取內(nèi)網(wǎng)IP地址的方法
import os from 'os';
export function getNetworkIp() {
let needHost = '';
try {
const network = os.networkInterfaces();
for (const dev in network) {
const iface = network[dev];
if (iface) {
for (let i = 0; i < iface.length; i++) {
const alias = iface[i];
if (
alias.family === 'IPv4' &&
alias.address !== '127.0.0.1' &&
!alias.internal
) {
needHost = alias.address;
}
}
}
}
} catch (e) {
needHost = 'localhost';
}
return needHost;
}3、配置環(huán)境變量(.env.XX)
BASE_IP="" BASE_IP_URL=""
4、配置vite.config.ts 文件
import { defineConfig } from 'vite'
import { fileURLToPath, URL } from 'node:url'
import vue from '@vitejs/plugin-vue'
import {getNetworkIp} from './src/utils/getIpos'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue()],
// 使用@
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
define: {
'import.meta.env.BASE_IP_URL': JSON.stringify(`http://${getNetworkIp()}:${process.env.PORT || 3000}`),
'import.meta.env.BASE_IP': JSON.stringify(`${getNetworkIp()}`),
},
})5、在vue文件中使用
<script setup lang='ts'>
const baseIP = import.meta.env.BASE_IP;
const baseIPURL = import.meta.env.BASE_IP_URL;
</script>
<template>
<div>
<div>地址為:{{ baseIPURL }}</div>
<div>IP地址為:{{ baseIP }}</div>
</div>
</template>
<style lang='scss' scoped>
</style>注意:
1、該方法在線上環(huán)境中,并不能獲取到真實(shí)客戶端的IP地址。
2、在本地運(yùn)行的時(shí)候獲取到IP地址(就是運(yùn)行程序時(shí)的nextWork地址)。并且在其他的電腦,訪問(wèn)運(yùn)行的項(xiàng)目鏈接的時(shí)候,獲取的仍是運(yùn)行前端項(xiàng)目的電腦的IP地址,并不是不同電腦獲取不同的IP地址。
利用WebRTC實(shí)現(xiàn)獲取內(nèi)網(wǎng)IP地址
實(shí)現(xiàn)效果

實(shí)現(xiàn)代碼
1、獲取IP地址的方法
export function getUserIP(callback) {
const RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
if (!RTCPeerConnection) {
callback('Not compatible with WebRTC');
return;
}
const pc = new RTCPeerConnection({ iceServers: [] });
const noop = () => {};
pc.createDataChannel('');
pc.createOffer().then(sdp => pc.setLocalDescription(sdp)).catch(noop);
pc.onicecandidate = ice => {
if (!ice || !ice.candidate || !ice.candidate.candidate) return;
const ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/;
const ipMatch = ice.candidate.candidate.match(ipRegex);
if (ipMatch) {
callback(ipMatch[1]);
pc.close();
}
};
}
2、在vue文件中使用
<script setup lang='ts'>
import {ref} from 'vue'
import {getUserIP} from '@/utils/getIpWebRTC.js'
let getip=ref('')
getUserIP(ip => {
getip.value=ip
console.log('User IP:', ip);
});
const baseIP = import.meta.env.BASE_IP;
const baseIPURL = import.meta.env.BASE_IP_URL;
</script>
<template>
<div>
<div>地址為:{{ baseIPURL }}</div>
<div>IP地址為:{{ baseIP }}</div>
<div>WebRTC IP地址為:{{ getip }}</div>
</div>
</template>
<style lang='scss' scoped>
</style>注意
1、使用該方法,在線上環(huán)境中,是可以獲取到客戶端IP地址的。(但是就是需要瀏覽器配置。)
2、需要在瀏覽器中,進(jìn)行配置才可以顯示IP地址。在不同的瀏覽器配置是不同的
3、例如:在谷歌瀏覽器中的進(jìn)入chrome://flags/地址將enable-webrtc-hide-local-ips-with-mdns的值為Disabled,才可以使用

利用插件的方式實(shí)現(xiàn)
使用internal-ip插件獲取內(nèi)網(wǎng)IP地址
1、官網(wǎng)地址 internal-ip
2、在使用該插件的時(shí)候,我的瀏覽器會(huì)彈出權(quán)限問(wèn)題,只有在允許的情況下,才能獲取IP地址。

3、若不允許,則報(bào)錯(cuò)不返回IP地址

使用第三方服務(wù)查詢公網(wǎng)IP地址
1、在有網(wǎng)絡(luò)的情況下,第三方API查詢IP地址的方式有很多,比如百度IP地址查詢,ifconfig.me、……
百度查詢Ip地址

ifconfig.me查詢IP地址

2、實(shí)現(xiàn)代碼
1)第三方服務(wù)API
import axios from 'axios'
// 利用百度第三方服務(wù)查詢到IP地址
export const BaiduAPIgetIp = async () => {
const response = await axios('https://qifu-api.baidubce.com/ip/local/geo/v1/district');
console.log(response,'BaiduAPIgetIp')
if(response&&response.data.code=='Success'){
return response.data.ip
}else{
return ''
}
}
// 使用ipinfo.io查詢IP地址
export const getIpinfo = async () => {
const response = await axios('https://ipinfo.io/ip');
return response.data||''
}
// 使用ifconfig查詢IP地址
export const getifconfig = async () => {
const response = await axios('https://ifconfig.me/');
return response.data||''
}
//使用ipify.io查詢IP地址(測(cè)試的時(shí)候,這接口沒(méi)有返回)
export const getIpify = async () => {
const response = await axios('https://api64.ipify.org?format=json');
}
2)在vue頁(yè)面中使用
<script setup lang='ts'>
import {ref,onMounted} from 'vue'
import {getUserIP} from '@/utils/getIpWebRTC.js'
import {BaiduAPIgetIp,getIpify,getIpinfo,getifconfig} from '@/utils/getIpApi.js'
let getip=ref('')
getUserIP(ip => {
getip.value=ip
});
const baseIP = import.meta.env.BASE_IP;
const baseIPURL = import.meta.env.BASE_IP_URL;
let baiduIp=ref('')
let Ipify=ref('')
let Ipinfo=ref('')
let ifconfig=ref('')
onMounted(async()=>{
// 第三方服務(wù)返回IP地址"124.64.23.233"?
baiduIp.value=await BaiduAPIgetIp()
// Ipify.value=await getIpify()
Ipinfo.value=await getIpinfo()
ifconfig.value=await getifconfig()
})
</script>
<template>
<div>
<div>地址為:{{ baseIPURL }}</div>
<div>IP地址為:{{ baseIP }}</div>
<div>WebRTC IP地址為:{{ getip }}</div>
<div>BaiduAPI IP地址為:{{ baiduIp }}</div>
<div>Ipify IP地址為:{{ Ipify }}</div>
<div>ipinfo IP地址為:{{ Ipinfo }}</div>
<div>ifconfig IP地址為:{{ ifconfig }}</div
</div>
</template>
<style lang='scss' scoped>
</style>
3、實(shí)現(xiàn)效果

4、關(guān)于為什么使用第三方API查詢出來(lái)的IP地址和本地的IPV4的地址不一樣?

兩者查詢出的IP不一致是因?yàn)椋汗W(wǎng)IP和私網(wǎng)IP
公網(wǎng)IP:是互聯(lián)網(wǎng)上唯一標(biāo)識(shí)設(shè)備的地址,允許設(shè)備直接與全球互聯(lián)網(wǎng)通信。它是公共地址,用于服務(wù)器或設(shè)備在互聯(lián)網(wǎng)上的唯一標(biāo)識(shí)。全球唯一,任何設(shè)備都可以通過(guò)互聯(lián)網(wǎng)訪問(wèn)到它
私網(wǎng)IP:是局域網(wǎng)(LAN)內(nèi)部使用的地址,用于設(shè)備在局域網(wǎng)內(nèi)的通信。它無(wú)法直接在互聯(lián)網(wǎng)上 訪問(wèn),通常由網(wǎng)絡(luò)管理員分配。僅在局域網(wǎng)內(nèi)有效,無(wú)法從互聯(lián)網(wǎng)直接訪問(wèn)
以上就是前端獲取IP地址的方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于前端獲取IP地址的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript排序算法動(dòng)畫(huà)演示效果的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇JavaScript排序算法動(dòng)畫(huà)演示效果的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
同時(shí)使用n個(gè)window onload加載實(shí)例介紹
window onload加載多個(gè)同時(shí)使用,想必有很多人沒(méi)有用過(guò)吧,接下來(lái)為大家詳細(xì)介紹下具體的使用方法,感興趣的朋友可以參考下2013-04-04
JavaScript高級(jí)程序設(shè)計(jì)閱讀筆記(五) ECMAScript中的運(yùn)算符(一)
ECMAScript中的運(yùn)算符,學(xué)習(xí)js的朋友可以看看2012-02-02
理解Javascript_07_理解instanceof實(shí)現(xiàn)原理
在《Javascript類(lèi)型檢測(cè)》一文中講到了用instanceof來(lái)用做檢測(cè)類(lèi)型,讓我們來(lái)回顧一下2010-10-10
一個(gè)可以得到元素真實(shí)的背景顏色的javascript腳本
一個(gè)可以得到元素真實(shí)的背景顏色的javascript腳本...2007-07-07
全面兼容的javascript時(shí)間格式化函數(shù)(比較實(shí)用)
這篇文章主要介紹了全面兼容比較實(shí)用的javascript時(shí)間格式化函數(shù),需要的朋友可以參考下2014-05-05
JScript|Event]面向事件驅(qū)動(dòng)的編程(二)--實(shí)例講解:將span模擬成超連接
JScript|Event]面向事件驅(qū)動(dòng)的編程(二)--實(shí)例講解:將span模擬成超連接...2007-01-01
七個(gè)基于JavaScript實(shí)現(xiàn)的情人節(jié)表白特效
情人節(jié)將至 程序員證明自己不是直男的時(shí)候到啦 我們也有自己的專(zhuān)屬代碼浪漫。本文將介紹七個(gè)利用JavaScript實(shí)現(xiàn)的情人節(jié)表白特效,需要的可以參考一下2022-01-01

