Ajax提交参数的值中带有html标签不能提交成功的解决办法(ASP.NET)
最近在公司做资源及文章上传功能遇到一个小问题,被坑了好半天。
该功能就类似利用富文本编辑器发布信息,但是用Ajax提交数据,因此提交参数值中不可避免的含有html标签。
在本地运行代码一直没问题,总是可以提交成功,但是代码部署到线上就不能成功提交数据了,被坑了好久,找了好半天才找到问题所在。
提交不成功的原因是因为我的提交数据中含有html标签,然后直接无法请求到我的目标地址。
然后解决办法如下:
1、在页面用JS的Base64编码(类似加密)带有html标签的参数值。
2、在目标地址获取到数据后,利用后台Base64解码方法对获取到的数据进行解码即可。
以下是我的JS的Base64编码和解码方法代码:
//下面是64个基本的编码 varbase64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; varbase64DecodeChars=newArray( -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, -1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1); //编码的方法 functionbase64encode(str){ varout,i,len; varc1,c2,c3; len=str.length; i=0; out=""; while(i<len){ c1=str.charCodeAt(i++)&0xff; if(i==len) { out+=base64EncodeChars.charAt(c1>>2); out+=base64EncodeChars.charAt((c1&0x3)<<4); out+="=="; break; } c2=str.charCodeAt(i++); if(i==len) { out+=base64EncodeChars.charAt(c1>>2); out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4)); out+=base64EncodeChars.charAt((c2&0xF)<<2); out+="="; break; } c3=str.charCodeAt(i++); out+=base64EncodeChars.charAt(c1>>2); out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4)); out+=base64EncodeChars.charAt(((c2&0xF)<<2)|((c3&0xC0)>>6)); out+=base64EncodeChars.charAt(c3&0x3F); } returnout; } //解码的方法 functionbase64decode(str){ varc1,c2,c3,c4; vari,len,out; len=str.length; i=0; out=""; while(i<len){ do{ c1=base64DecodeChars[str.charCodeAt(i++)&0xff]; }while(i<len&&c1==-1); if(c1==-1) break; do{ c2=base64DecodeChars[str.charCodeAt(i++)&0xff]; }while(i<len&&c2==-1); if(c2==-1) break; out+=String.fromCharCode((c1<<2)|((c2&0x30)>>4)); do{ c3=str.charCodeAt(i++)&0xff; if(c3==61) returnout; c3=base64DecodeChars[c3]; }while(i<len&&c3==-1); if(c3==-1) break; out+=String.fromCharCode(((c2&0XF)<<4)|((c3&0x3C)>>2)); do{ c4=str.charCodeAt(i++)&0xff; if(c4==61) returnout; c4=base64DecodeChars[c4]; }while(i<len&&c4==-1); if(c4==-1) break; out+=String.fromCharCode(((c3&0x03)<<6)|c4); } returnout; } functionutf16to8(str){ varout,i,len,c; out=""; len=str.length; for(i=0;i<len;i++){ c=str.charCodeAt(i); if((c>=0x0001)&&(c<=0x007F)){ out+=str.charAt(i); }elseif(c>0x07FF){ out+=String.fromCharCode(0xE0|((c>>12)&0x0F)); out+=String.fromCharCode(0x80|((c>>6)&0x3F)); out+=String.fromCharCode(0x80|((c>>0)&0x3F)); }else{ out+=String.fromCharCode(0xC0|((c>>6)&0x1F)); out+=String.fromCharCode(0x80|((c>>0)&0x3F)); } } returnout; } functionutf8to16(str){ varout,i,len,c; varchar2,char3; out=""; len=str.length; i=0; while(i<len){ c=str.charCodeAt(i++); switch(c>>4) { case0:case1:case2:case3:case4:case5:case6:case7: //0xxxxxxx out+=str.charAt(i-1); break; case12:case13: //110xxxxx10xxxxxx char2=str.charCodeAt(i++); out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F)); break; case14: //1110xxxx10xxxxxx10xxxxxx char2=str.charCodeAt(i++); char3=str.charCodeAt(i++); out+=String.fromCharCode(((c&0x0F)<<12)| ((char2&0x3F)<<6)| ((char3&0x3F)<<0)); break; } } returnout; }
页面调用JS方法进行Base64编码代码如下:
vararticleContent=editor.getContent(); articleContent=base64encode(utf16to8(articleContent));
但是呢,又遇到一个新的问题,用JS对数据进行Base64编码后,JS居然把加号(+)替换成了空格,造成我后台方法解码出来的数据不正确。
解决办法如下:
本人首先采用JS方法replace()方法进行替换,但是有错误,JS只是把我的第一个空格替换成了加号(+),最后解决办法如下。
在后台(目标接受地址下)对获取到的数据,把空格替换成加号(+)。代码如下:
stringcontent=Request["content"].ToString(); if(content.Contains("")) { content=content.Replace("","+"); } //byte[]sa=Convert.FromBase64String(content); //EncodingAnsi=Encoding.GetEncoding("GB2312"); //content=Ansi.GetString(sa); content=Base64Decrypt(content);//Base64解码
如果后台的Base64编码和解码方法不会的请看下面:
///<summary> ///Base64加密 ///</summary> ///<paramname="input">需要加密的字符串</param> ///<returns></returns> publicstaticstringBase64Encrypt(stringinput) { returnBase64Encrypt(input,newUTF8Encoding()); } ///<summary> ///Base64加密 ///</summary> ///<paramname="input">需要加密的字符串</param> ///<paramname="encode">字符编码</param> ///<returns></returns> publicstaticstringBase64Encrypt(stringinput,Encodingencode) { returnConvert.ToBase64String(encode.GetBytes(input)); } ///<summary> ///Base64解密 ///</summary> ///<paramname="input">需要解密的字符串</param> ///<returns></returns> publicstaticstringBase64Decrypt(stringinput) { returnBase64Decrypt(input,newUTF8Encoding()); } ///<summary> ///Base64解密 ///</summary> ///<paramname="input">需要解密的字符串</param> ///<paramname="encode">字符的编码</param> ///<returns></returns> publicstaticstringBase64Decrypt(stringinput,Encodingencode) { returnencode.GetString(Convert.FromBase64String(input)); }
以上所述是小编给大家介绍的Ajax提交参数的值中带有html标签不能提交成功的解决办法(ASP.NET),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!