zoukankan      html  css  js  c++  java
  • Ajax提交参数的值中带有html标签不能提交成功的解决办法(ASP.NET)

            最近在公司做资源及文章上传功能遇到一个小问题,被坑了好半天。

            该功能就类似利用富文本编辑器发布信息,但是用Ajax提交数据,因此提交参数值中不可避免的含有html标签。

            在本地运行代码一直没问题,总是可以提交成功,但是代码部署到线上就不能成功提交数据了,被坑了好久,找了好半天才找到问题所在。

            提交不成功的原因是因为我的提交数据中含有html标签,然后直接无法请求到我的目标地址。

             然后解决办法如下:

             1、在页面用JS的Base64编码(类似加密)带有html标签的参数值。

             2、在目标地址获取到数据后,利用后台Base64解码方法对获取到的数据进行解码即可。

              以下是我的JS的Base64编码和解码方法代码:

              

    //下面是64个基本的编码
      var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      var base64DecodeChars = new Array(
          -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);
     //编码的方法
     function base64encode(str) {
              var out, i, len;
            var c1, 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);
                 }
             return out;
          }
      //解码的方法
      function base64decode(str) {
             var c1, c2, c3, c4;
            var i, 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)
                            return out;
                        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)
                           return out;
                        c4 = base64DecodeChars[c4];
                     } while(i < len && c4 == -1);
                if(c4 == -1)
                       break;
                 out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
                }
             return out;
         }
     function utf16to8(str) {
             var out, 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);
                    } else if (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));
                        }
                 }
            return out;
         }
     function utf8to16(str) {
          var out, i, len, c;
            var char2, char3;
            out = "";
            len = str.length;
          i = 0;
            while(i < len) {
              c = str.charCodeAt(i++);
            switch(c >> 4)
                 { 
                case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                        // 0xxxxxxx
                        out += str.charAt(i-1);
                        break;
                      case 12: case 13:
                       // 110x xxxx   10xx xxxx
                        char2 = str.charCodeAt(i++);
                      out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                      break;
                   case 14:
                     // 1110 xxxx  10xx xxxx  10xx xxxx
                     char2 = str.charCodeAt(i++);
                        char3 = str.charCodeAt(i++);
                         out += String.fromCharCode(((c & 0x0F) << 12) |
                                        ((char2 & 0x3F) << 6) |
                                       ((char3 & 0x3F) << 0));
                        break;
                   }
                 }
            return out;
        }
    View Code

        页面调用JS方法进行Base64编码代码如下:

         var articleContent = editor.getContent();

         articleContent = base64encode(utf16to8(articleContent));

          

         但是呢,又遇到一个新的问题,用JS对数据进行Base64编码后,JS居然把加号(+)替换成了空格,造成我后台方法解码出来的数据不正确。

          解决办法如下:

          本人首先采用JS方法replace()方法进行替换,但是有错误,JS只是把我的第一个空格替换成了加号(+),最后解决办法如下。

          在后台(目标接受地址下)对获取到的数据,把空格替换成加号(+)。代码如下:

          

             string content = Request["content"].ToString();
                if (content.Contains(""))
                    {
                        content=content.Replace(" ", "+");
                    }
                  
                //byte[] sa = Convert.FromBase64String(content);
    
                //Encoding Ansi = Encoding.GetEncoding("GB2312");
                // content = Ansi.GetString(sa);
    
               content = Base64Decrypt(content);//Base64解码

           如果后台的Base64编码和解码方法不会的请看下面:

         

    /// <summary>
            /// Base64加密
            /// </summary>
            /// <param name="input">需要加密的字符串</param>
            /// <returns></returns>
            public static string Base64Encrypt(string input)
            {
                return Base64Encrypt(input, new UTF8Encoding());
            }
    
            /// <summary>
            /// Base64加密
            /// </summary>
            /// <param name="input">需要加密的字符串</param>
            /// <param name="encode">字符编码</param>
            /// <returns></returns>
            public static string Base64Encrypt(string input, Encoding encode)
            {
                return Convert.ToBase64String(encode.GetBytes(input));
            }
    
            /// <summary>
            /// Base64解密
            /// </summary>
            /// <param name="input">需要解密的字符串</param>
            /// <returns></returns>
            public static string Base64Decrypt(string input)
            {
                return Base64Decrypt(input, new UTF8Encoding());
            }
    
    
            /// <summary>
            /// Base64解密
            /// </summary>
            /// <param name="input">需要解密的字符串</param>
            /// <param name="encode">字符的编码</param>
            /// <returns></returns>
            public static string Base64Decrypt(string input, Encoding encode)
            {
                return encode.GetString(Convert.FromBase64String(input));
            }
    View Code

             问题解决,大快人心,算是又学到了点儿东西。

  • 相关阅读:
    关于CString与VARIANT(CComVariant)之间的转化
    关于_T()说明
    关于COM组件调用
    关于ATML信号定义的理解-1
    关于DOM的事件操作
    javascript(二)
    javascript(一)
    进程.线程.协程之间的区别?
    CSS
    HTML 浅层漫谈
  • 原文地址:https://www.cnblogs.com/sharing1986687846/p/6222136.html
Copyright © 2011-2022 走看看