通过设置vite获取IP地点
实现结果
实现方法
1、需要下载os插件
2、获取内网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、设置环境变量(.env.XX)
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、该方法在线上环境中,并不能获取到真实客户端的IP地点。
2、在本地运行的时候获取到IP地点(就是运行程序时的nextWork地点)。并且在其他的电脑,访问运行的项目链接的时候,获取的仍是运行前端项目标电脑的IP地点,并不是差别电脑获取差别的IP地点。
利用WebRTC实现获取内网IP地点
实现结果
实今世码
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、使用该方法,在线上环境中,是可以获取到客户端IP地点的。(但是就是需要浏览器设置。)
2、需要在浏览器中,进行设置才可以表现IP地点。在差别的浏览器设置是差别的
3、例如:在谷歌浏览器中的进入chrome://flags/地点将enable-webrtc-hide-local-ips-with-mdns的值为Disabled,才可以使用
利用插件的方式实现
使用internal-ip插件获取内网IP地点
1、官网地点 internal-ip
2、在使用该插件的时候,我的浏览器会弹出权限问题,只有在允许的环境下,才华获取IP地点。
3、若不允许,则报错不返回IP地点
使用第三方服务查询公网IP地点
1、在有网络的环境下,第三方API查询IP地点的方式有很多,比如百度IP地点查询,ifconfig.me、……
百度查询Ip地点
ifconfig.me查询IP地点
2、实今世码
1)第三方服务API
- import axios from 'axios'
- // 利用百度第三方服务查询到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地址(测试的时候,这接口没有返回)
- export const getIpify = async () => {
- const response = await axios('https://api64.ipify.org?format=json');
- }
复制代码 2)在vue页面中使用
- <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()=>{
- // 第三方服务返回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、实现结果
4、关于为什么使用第三方API查询出来的IP地点和本地的IPV4的地点不一样?
两者查询出的IP不一致是由于:公网IP和私网IP
公网IP:是互联网上唯一标识设备的地点,允许设备直接与环球互联网通讯。它是公共地点,用于服务器或设备在互联网上的唯一标识。环球唯一,任何设备都可以通过互联网访问到它
私网IP:是局域网(LAN)内部使用的地点,用于设备在局域网内的通讯。它无法直接在互联网上访问,通常由网络管理员分配。仅在局域网内有效,无法从互联网直接访问
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |