最近项目中很多跨域的问题,有时候跨域要传递很多参数,甚至有时候要传递整个对象,处理的方法是把对象转换成JSON形式的字符串再传递。此时该JSON字符串就比较长,作为参数附加到URL后面,URL就会变得很长,而浏览器和服务器对URL长度是有限制的,因此很容易出错。这里记录一下解决该问题的方法。
上网查询得知:
不同浏览器对URL长度的限制不同,不同的Web服务器处理URL的最大长度的能力也不同。
IE中URL的最大长度是2083字符(资料:http://support.microsoft.com/kb/208427)
解决URL过长的方法:转为使用POST提交数据
例子:
<iframe id="iframe1" src="" width="100%" height="740px" frameborder="no"></iframe>用Ajax给iframe赋src值,$("#iframe1").src=url;
问题:当url很长时,很可能超出浏览器和服务器对url长度的限制。
第一种解决方法:
<iframe id="iframe1" src="proxy/proxytest.jsp" width="100%" height="740px" frameborder="no"></iframe>src中链JSP页面,proxytest.jsp内容如下:
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <body> <form id="test" action="" method="post"> <input id="testId1" type="hidden" name="testId1"/> <input id="testId2" type="hidden" name="testId2"/> </form> </body> </html>form中的action为空,提交方式是POST,有隐藏域,该<input type="hidden"/>是要提交到后台的参数,所以在Struts2中name值和后台接收的参数保持一致。
使用的时候,JS如下:
document.getElementById("iframe1").contentWindow.document.getElementById("testId1").value="<s:property value=‘testId1‘/>"; document.getElementById("iframe1").contentWindow.document.getElementById("testId2").value="<s:property value=‘testId2‘/>"; document.getElementById("iframe1").contentWindow.document.getElementById("test").setAttribute("action",url); document.getElementById("iframe1").contentWindow.document.getElementById("test").submit();js把需要提交到后台的参数值赋给对应的<input type=”hidden”/>,js把url赋给form的action,并提交form,该form提交到包括它的iframe中。因为参数值可以通过<input type=”hidden”/>提交,而不用非要放到url后边,可以很大程度的缩短url的长度。
第二种解决方法:
把整个iframe用js构造,而不是像现在这样(HTML把iframe写好,然后js赋给src值)。如:
$("#iframe1").html("<iframe id =\"resultIFrame\" name=\"tag\" src=\" " + url + " \" frameborder=\"0\" scrolling=\"no\" width=\"100%\" height=\"100%\" onload=\"this.height=tag.document.body.scrollHeight\"></iframe>");这种方法使用与url比较长但又不是非常长的时候。经试验,如果url特别长,这种方法也就解决不了了。第一种方法就好用多了