最近項目中很多跨域的問題,有時候跨域要傳遞很多參數,甚至有時候要傳遞整個對象,處理的方法是把對象轉換成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特別長,這種方法也就解決不了了。第一種方法就好用多了