Cette fois, je vais vous expliquer comment gérer l'échec de la balise html de soumission lorsque Ajax soumet des paramètres. Quelles sont les précautions lors de la gestion des paramètres de soumission Ajax et de l'échec de la balise html. soumission. Voici le combat réel. Jetons un coup d’œil au cas.
Récemment, j'ai rencontré un petit problème dans la fonction de téléchargement de ressources et d'articles de l'entreprise, et je suis resté bloqué pendant longtemps.
Cette fonction est similaire à l'utilisation d'un éditeur de texte enrichi pour publier des informations, mais utilise Ajax pour soumettre des données, de sorte que la valeur du paramètre soumise contient inévitablement des balises HTML.
Il n'y a eu aucun problème pour exécuter le code localement et la soumission peut toujours réussir. Cependant, lorsque le code est déployé en ligne, les données ne peuvent pas être soumises avec succès pendant longtemps, et cela. il m'a fallu beaucoup de temps pour trouver le problème.
La raison pour laquelle la soumission a échoué est que mes données de soumission contiennent des balises html et que mon adresse cible ne peut pas être directement demandée.
Ensuite, la solution est la suivante :
1. Utilisez l'encodage JS Base64 (similaire au cryptage) sur la page avec la valeur de paramètre de la balise html.
2. Après avoir obtenu les données à l'adresse cible, utilisez la méthode de décodage Base64 en arrière-plan pour décoder les données obtenues.
Voici le code de la méthode d'encodage et de décodage Base64 de mon JS :
//下面是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; }
La page appelle la méthode JS pour effectuer le code d'encodage Base64 comme suit :
var articleContent = editor.getContent(); articleContent = base64encode(utf16to8(articleContent));
Mais j'ai rencontré un nouveau problème. Après avoir utilisé JS pour encoder les données en Base64, JS a en fait remplacé le signe plus (+) par un espace, ce qui rend les données décodées par ma méthode d'arrière-plan incorrectes.
La solution est la suivante :
J'ai d'abord utilisé la méthode JS replace() pour remplacer, mais il y a eu une erreur JS. je viens de remplacer mon premier Un espace est remplacé par un signe plus (+). La solution finale est la suivante.
En arrière-plan (sous l'adresse de réception cible), remplacez les espaces par le signe plus (+) pour les données obtenues. Le code est le suivant :
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解码
Si la méthode d'encodage et de décodage base64 en arrière-plan ne peut pas être lue ci-dessous :
/// <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)); }
Je crois que vous maîtrisez la méthode de cet article , vous maîtrisez déjà la méthode, plus excitante. Veuillez faire attention aux autres articles connexes sur le site Web chinois de php !
Lecture recommandée :
Téléchargement asynchrone de fichiers ou d'images ajax
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!