URL太长导致参数被截断的问题【转】

做Web开发时经常涉及到页面之间的转跳,页面之间的转跳就会涉及到页面之间参数的传递,通过URL传递参数是常用的方法之一,但是微软说:"Maximum URL length is 2,083 characters in Internet Explorer",也就是说URL是有长度限制的。

    ASP.NET应用程序前台与后台的数据交换都是通过FORM表单来完成的,FORM表单提供了两种数据传输方式:GET和POST,这个两种数据传输方式在实际传输中有很大的不同,但ASP.NET框架中已经屏蔽了二者的一些差异。GET是用来从服务器上获得数据,而POST是用来向服务器提交数据的。二者 数据传输过程中分别对应了HTTP协议中的GET和POST方法。

    GET方式是把参数数据队列加到提交表单的ACTION属性所指的URL后面,并且使用"?"隔开,值和表单内各个字段一一对应,在URL中可以看到,它是FROM默认的提交方式,受URL长度的限制,它所能传递的数据量小。
    POST方式是把表单中的数据放在FORM载体中, 按照变量和值相对应的方式,传递到ACTION所指向URL,POST可以传递大数据量的信息到服务器,通常文件上传就是使用POST方式上传。

    为解决GET方式传递大数据量参数的问题,要使用POST方式进行数据提交,下面是一个用来代替window.open的方法
1.JavaScript
/*
 * PostNewWin
 * Author:ppchen
 
*/
var  PostNewWin  =   function (url){
    
var  urlArr  =  url.split( " ? " );
    
var  postUrl  =  urlArr[ 0 ];
    
var  postData  =  urlArr[ 1 ];
    
var  iframe  =  document.getElementById( " postData_iframe " );
    
if ( ! iframe){
        iframe 
=  document.createElement( " iframe " );
        iframe.id 
=   " postData_iframe " ;
        iframe.scr
=   " about:blank " ;
        iframe.frameborder 
=   " 0 " ;
        iframe.style.width 
=   " 0px " ;
        iframe.style.height 
=   " 0px " ;
        
        
var  form  =  document.createElement( " form " );
        form.id 
=   " postData_form " ;
        form.method 
=   " post " ;
        form.target 
=   " _blank " ;
        
        document.body.appendChild(iframe);
        iframe.contentWindow.document.write(
" <body> "   +  form.outerHTML  +   " </body> " );
    }
    iframe.contentWindow.document.getElementById(
" postData_form " ).innerHTML  =   " <input name='postData' id='postData' type='text' value=' "   +  postData  +   " '/> " ;
    iframe.contentWindow.document.getElementById(
" postData_form " ).action  =  postUrl;
    iframe.contentWindow.document.getElementById(
" postData_form " ).submit();
};
 
2.CSharp
///   <summary>
///  从Form中取得参数
///  Author:ppchen
///   </summary>
///   <returns> 参数集合 </returns>
private  NameValueCollection ParseFormData()
{
    NameValueCollection sQueryString 
=   new  NameValueCollection();
    
if  ( this .Request.Form.Count  >   0   &&   this .Request.Form[ " postData " !=   null )
    {
        
string  sPostData  =   this .Request.Form[ " postData " ].ToString();
        sPostData 
=  sPostData.Trim( new   char [] {  ' & ' '   '  });
        
if  ( ! string .IsNullOrEmpty(sPostData))
        {
            
string [] sParameterList  =  sPostData.Split( ' & ' );
            
for  ( int  i  =   0 ; i  <  sParameterList.Length; i ++ )
            {
                
string [] sParameter  =  sParameterList[i].Split( ' = ' );
                
for  ( int  j  =   0 ; j  <  sParameter.Length; j  =  j  +   2 )
                {
                    sQueryString.Add(sParameter[j], HttpUtility.UrlDecode(sParameter[j 
+   1 ]));
                }
            }
        }
    }
    
return  sQueryString;
}

通过以上的JS代码在客户端打开页面,通过以上的CS代码在服务端取得参数,这样使用了POST方式解决了GET方式中URL的长度限制,可以传递大数据量的参数了:)

测试代码下载:
PostNewWin


==========================================


http编程中的get和post混合使用方式

问题来源于get和post的特点和限制。对于get请求,我们可以很方便的使用window.opener的方式与父页面进行通讯,但是根据http协议的规定,url最大长度是2083个字节,可以用于GET传递数据的长度是2048个字节。对于post请求,虽然没有最大长度的限制,却不能方便的使用window.opener与父页面进行通讯。
关于如何使用javascript自动将一段get请求转变成一个post请求,网上有很多的方法,其主要思想就是动态构造一个iframe,并将get请求中的url参数值赋给input控件,最后设置form的action地址并调用submit方法。
园子里有人已经给出一个解决方法, http://www.cnblogs.com/ppchen/archive/2008/03/18/1109607.html
这里转载如下:
ContractedBlock.gif ExpandedBlockStart.gif Code
var PostNewWin = function(url){
    
var urlArr = url.split("?");
    
var postUrl = urlArr[0];
    
var postData = urlArr[1];
    
var iframe = document.getElementById("postData_iframe");
    
if(!iframe){
        iframe 
= document.createElement("iframe");
        iframe.id 
= "postData_iframe";
        iframe.scr
= "about:blank";
        iframe.frameborder 
= "0";
        iframe.style.width 
= "0px";
        iframe.style.height 
= "0px";
        
        
var form = document.createElement("form");
        form.id 
= "postData_form";
        form.method 
= "post";
        form.target 
= "_blank";
        
        document.body.appendChild(iframe);
        iframe.contentWindow.document.write(
"<body>" + form.outerHTML + "</body>");
    }
    iframe.contentWindow.document.getElementById(
"postData_form").innerHTML = "<input name='postData' id='postData' type='text' value='" + postData + "'/>";
    iframe.contentWindow.document.getElementById(
"postData_form").action = postUrl;
    iframe.contentWindow.document.getElementById(
"postData_form").submit();
};

例如原来有一个函数,使用get请求打开新页面
function openNewWindow()
{
      var url = http://www.website.com/page1.aspx?p1=v1&p2=v2;
      var win =window.open(url);
}
因为ur的长度问题,现在改为使用post方式提交,如下所示:
function openNewWindow()
{
      var url = http://www.website.com/page1.aspx?p1=v1&p2=v2;
      //var win =window.open(url); 
      PostNewWin(url);
}

这里有一个问题就是,使用这种方式后,就无法使用window.opener与父页面进行交互了,因为通过这个函数,已经将get请求变成一个post请求了。为了可以使用post的方式提较大数据,同时也可以使用window.open(url)方式的window.opener与父页面通讯,在这里做一点小的改版,首先使用window.open(url)时候,增加一个参数,指定打开窗口的名称,,如下所示:
function openNewWindow()
{
      var url = http://www.website.com/page1.aspx?p1=v1&p2=v2;
      var winName  = "";
      var win =window.open("about:blank",winName ); 
      PostNewWin(url,winName);
}
同时修改PostNewWin函数,将这个新窗口的句柄传递给这个函数,将post请求的target设置为这个参数,如下所示:
var  PostNewWin  =   function (url,winName){
      .........
  
              form.target  =  winName
      .......
};
这样就可以同时使用post和get两种方式的优点了。

http://www.cnblogs.com/chegan/archive/2009/09/28/1575536.html

转载于:https://www.cnblogs.com/kingjiong/archive/2009/09/28/1575731.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值