iframe跨域传值超过2M的问题解决

本文介绍了一种使用iframe结合JS创建form表单进行POST请求的方法,以解决iframe传值超过2K限制的问题。通过配置Tomcat以允许更大的POST数据长度和调整跨域策略,实现数据的有效传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用iframe进行传值时,如果采用URL的方式传递,则最大只能传递大约2k的数据,超过这个长度就会被截断了,那么是否可以采用post的方式传值呢?答案是可以的,我们可以采用js创建一个form表单,并将此form提交到iframe上,这样就能做到打破2k数据的限制。

 

<iframe id="frame1" name="frame1" src="" style="display:none"></iframe>
<script>
var tranVal = function(){
	document.getElementById("frame1").style.display = "block";
	var postForm = document.createElement("form");
	postForm.method = "post";
	postForm.action = "http://localhost:8080/test/getdata.jsp";
	postForm.target = "frame1";//用来将数据提交到frame1上
	
	var input = document.createElement("input");
	input.type = "hidden";
	input.name = "username";//这个是传值的名称,要记住
	var strA = "1234567890";
	//循环500000次后,保证字符串的大小大于2M
	for(var i=0;i<500000;i++) strA+= "1234567890";
	input.value = strA;
	postForm.appendChild(input);
	document.body.appendChild(postForm);
	postForm.submit();
	//用完之后,不要忘记删掉
	postForm.removeChild(input);
	document.body.removeChild(postForm);
}
</script>
<button onclick="tranVal()">
	传递值
</button>

 

还需要注意2个问题: 

1 tomcat下post不能超过2M的问题

这个需要将tomcat的配置文件server.xml修改一下:

 

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" maxPostSize="0"/>

 maxPostSize为0时,表示不用限制长度。

2 跨域的问题

跨域不影响iframe的post传值,发送方的tomcat无需更改,只是需要将接收方的tomcat的maxPostSize修改为0即可。

### Vue3 中 iframe 通信解决方案 #### 使用 `postMessage` 方法实现通信 在现代 Web 开发中,`window.postMessage()` 是一种安全可靠的方法来实现在不同源的窗口或框架间递消息。这种方法不仅适用于父子页面间的通信,也支持更复杂的场景。 对于 Vue3 应用中的 iframe 问题,可以通过以下方式处理: 1. **父页面向子页面发送消息** 当需要从宿主页面向嵌入的 iframe 发送信息时,可以调用 iframe 对象上的 postMessage 函数[^1]。 ```javascript // 父页面 (Vue 组件) const sendMessageToIframe = () => { const message = { type: 'greeting', content: 'Hello from parent!' }; document.querySelector('iframe').contentWindow.postMessage(message, '*'); }; ``` 2. **子页面接收来自父页面的消息并作出回应** 为了使内嵌于 iframe 的网页能够接收到外部来的内容,需设置一个全局事件监听器用于捕捉这些消息,并根据实际情况做出相应操作。 ```javascript // 子页面 (HTML 文件头部 script 标签内部 或者单独 JS 文件) window.addEventListener('message', function(event) { // 安全检查:验证消息来源是否可信 if (event.origin !== "http://example.com") return; console.log(`Received ${event.data.type}:`, event.data.content); // 向父级回数据 window.parent.postMessage({type:'acknowledge'}, "*"); }); ``` 3. **子页面主动向父页面发送消息** 同样地,如果希望由 iframe 内部发起通讯,则可以在其中执行类似的逻辑,只是方向相反——即通过访问上级上下文 (`parent`) 来触发相应的动作。 ```javascript // 子页面 function notifyParent() { var data = { action: 'updateStatus' }; window.parent.postMessage(data, '*'); // '*' 表示不限定目标网址 } ``` 4. **父页面监听子页面发出的信息** 最后一步是在宿主页上建立对应的侦听机制以便及时获取到来自 iframe 的反馈。 ```javascript // 父页面 (Vue 组件 mounted 钩子里) mounted() { window.addEventListener('message', this.handleIFrameMessages); }, methods: { handleIFrameMessages(e){ console.log('Got response:', e.data); // 进行进一步业务逻辑... } } ``` 以上方法展示了如何利用 H5 提供的新特性完成两个独立站点之间的交互过程,既保持了各自的安全边界又实现了必要的资源共享和服务协同工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值