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),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!