在LWC中镶嵌VF Page获取用户IP

有一个接口,必须得传用户IP参数,然后LWC还不能直接获取P地址,上网上查,说是得用VF Page才能获取用户的IP地址,于是就有了在LWC中镶嵌VF Page的问题。

这个VF Page是一个功能性的页面,没有需要显示出来的内容,该VF Page在用户的眼里是不可见的。

首先创建VF Page,这个VF Page得借助一个Apex类能获取到用户IP。

java 复制代码
public without sharing class GuestUserIPController {

    public String ipAddress { get; set; }

    public GuestUserIPController() {
        // 从当前页面的请求头中获取IP地址
        Map<String, String> headers = ApexPages.currentPage().getHeaders();
        
        // 按优先级尝试多个请求头字段,以应对不同的网络环境
        ipAddress = headers.get('True-Client-IP');
        if (String.isEmpty(ipAddress)) {
            ipAddress = headers.get('X-Salesforce-SIP');
        }
        if (String.isEmpty(ipAddress)) {
            ipAddress = headers.get('X-Forwarded-For');
        }
        // 如果都为空,可以设置一个默认值或留空
        if (String.isEmpty(ipAddress)) {
            ipAddress = 'IP not available';
        }
    }
}
html 复制代码
<apex:page controller="GuestUserIPController" showHeader="false" standardStylesheets="false" sidebar="false">
    <ipAddress>{!ipAddress}</ipAddress>
    <script>
        // Get the IP address from the Visualforce page
        var ipAddress = document.querySelector('ipAddress').textContent;
        parent.postMessage({
                            type: 'ipAddress',
                            ip: ipAddress
                        }, '*');
        console.log('IP address sent to parent window: ' + ipAddress);
    </script>
</apex:page>

页面获得IP之后,将向LWC发布消息,把ip传出去。

然后LWC页面用iframe把这个VF Page页面镶嵌进去

html 复制代码
<div style="display:none;">
    <iframe src={vfPageUrl}></iframe>
</div>

在LWC的 connectedCallback方法中添加收取ip的方法

javascript 复制代码
window.onmessage = (event) => {
    const data = event.data;
    if (data.type === 'ipAddress'){
        this.ipAddress = data.ip;
        console.log('Received IP Address from iframe:', this.ipAddress);
    }
}

这样就可以获取浏览用户的IP了

相关推荐
中文呀6 小时前
三维 GIS 离线缓存实战:逆向 CesiumOfflineCache,并亲手为它补上"自动更新"能力
前端
前进前进前进7 小时前
TRAE 全链路实战:做了一个警示牌一键生成器:纯 Canvas、单文件、零依赖
前端
小万7428 小时前
God‘s Eye View 深度解析:15 路公开信号 + CesiumJS 的浏览器级 OSINT 控制台,60 帧渲染的“真实间谍卫星模拟器”
前端
IT星宿8 小时前
浏览器标签页全是一个图标:我用名字哈希生成 favicon,让每个项目都有身份标识
前端
OpsEye8 小时前
大模型账单对账难:不同厂商 Token 统计口径差异怎么处理
javascript·ai编程
全栈项目管理程序猿8 小时前
ArcGIS JS 基础教程(32):体元系列 - VoxelSlice 体元切片
前端·javascript
拖孩10 小时前
AI 帮我写的小程序「厨菜记」上线满月了,挣了两百块!!!
前端·后端·微信小程序
用户3600555790010 小时前
Kestrel_VLLM - 13 · 为什么排除 MoE FFN Tiling 与 Tensor Core
前端
Hilaku11 小时前
AI 流式输出都用 SSE,什么时候必须换 WebSocket?
前端·javascript·程序员
奇牙coding11 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai