解决iframe参数过长无法加载问题小记

项目中用到了iframe,传参的时候使用的src属性,默认采用的get方式,此种方式在参数较长的时候就会报错(404无法找到资源),为了解决这种情况,改为采用post方式提交。解决方法:结合form表单,利用表单的post请求方式达到目的。

实现方式 
增加一个form表单的标签,method设置为post,target设置一个标识,假如target=”target1” 
在iframe设置name属性,name需要与target一致 name = “target1”

发送请求时通过发送form submit请求来使用post方式
以下代码用于定义iframe和相关form表单。

<form id="form1" action="" target="target1" method="post">
        <input name="Year" type="hidden" value="" />
        <input name="CommentUnitCode" type="hidden" value="" />
        <input name="CommentUnitType" type="hidden" value="" />
        <input name="dataType" type="hidden" value="" />
</form>
<iframe id="iframe1" name="target1"  src="" frameborder="0"></iframe>

以下代码用于定义form表单的提交对应的action方法和参数,这样就以post方式将参数传至后台,不必再担心参数过长的问题。 

var frame1 = document.getElementById('iframe1');
var url1 = "/DataDisplay/ShowRangeDataPage";
$('#form1 input[name=Year]').val(year);
$('#form1 input[name=CommentUnitCode]').val(CommentUnitCode);
$('#form1 input[name=CommentUnitType]').val(CommentUnitType);
$('#form1 input[name=dataType]').val(dataparams.dataType);
$('#form1').attr('action', url1);
$('#form1').submit();

表单提交后,在后台获取并保存参数值。

[HttpPost]
public ActionResult ShowRangeDataPage(ReportDataListRequest request)
{
	ViewBag.Year = request.Year;
	ViewBag.CommentElementValue = request.CommentElementValue;
	ViewBag.CommentUnitValue = request.CommentUnitValue;
	ViewBag.CommentUnitCode = request.CommentUnitCode;
	ViewBag.CommentUnitType = request.CommentUnitType;
	ViewBag.dataType = request.dataType;
	return View();
}     

前端ShowRangeDataPage页面调用post传的参数。

$.ajax({
		url: postUrl,
		type: 'post',
		dataType: 'json',
		data: {
			Year: Year,
			CommentUnitCode: '@ViewBag.CommentUnitCode',
			CommentUnitType: '@ViewBag.CommentUnitType',
			dataType: '@ViewBag.dataType'
		},
		success: function (result) {
			var data = eval(result.PieDataList);  
			data.sort(function (a, b) {
				return b.value - a.value;
			});
			clickProvice(data);
		},
		error:function (message) {
			console.log(message);
		}
});        

 

解决`iframe`加载文件的跨域问题通常涉及到以下几个步骤[^1]: 1. **理解同源策略**:跨域问题是由于浏览器的安全机制——同源策略(Same-Origin Policy)所限,它防止了一个源的内容直接访问另一个源的资源。了解并尊重这一原则是第一步。 2. **JSONP(JSON with Padding)**:如果服务器支持,可以通过JSONP(一种利用`<script>`标签跨域获取数据的技术)从非同源服务器请求数据,然后在回调函数中解析返回的JSON数据。 ```javascript function handleResponse(data) { // 处理接收到的跨域数据 } var script = document.createElement('script'); script.src = 'http://example.com/data.php?callback=handleResponse'; document.body.appendChild(script); ``` 3. **CORS(Cross-Origin Resource Sharing)**:对于现代的HTTP服务器,可以设置响应头`Access-Control-Allow-Origin`来允许特定来源跨域访问。客户端发起带有`Origin`头的预检请求(如`OPTIONS`),服务器同意后,正式请求才得以执行。 4. **代理服务器**:通过在服务器端设置一个代理,将请求转发到目标服务器,然后由代理服务器返回结果给前端。这样前端与目标服务器之间就没有直接的跨域关系。 5. **`form+iframe`**:在表单提交文件时,可以创建一个`<iframe>`来隐藏表单,这样表单数据会作为`POST`请求发送到同一域名下的服务器,绕过同源策略。 ```html <form action="proxy.php" method="post" enctype="multipart/form-data" target="hidden_iframe"> <!-- ... --> </form> <iframe name="hidden_iframe" style="display:none;"></iframe> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值