J'utilise la méthode Javascript decodeURIComponent
pour décoder une URL encodée. Maintenant j'ai un problème, que parfois l'URL est encodée deux fois lors de la redirection entre les serveurs, parfois elle n'est encodée qu'une seule fois.
Je veux vérifier que si l'URL est toujours encodée après avoir appelé la méthode decodeURIComponent
. Comment puis je faire ça? Tout pointeur me serait très utile.
Si j'appelle récursivement une méthode et vérifie que si l'URL donnée contient toujours "%", si elle contient "%" alors décodez-la et appelez à nouveau la méthode; et si ce n'est pas le renvoyer à l'appelant, cela fonctionnera-t-il?
Pour mon cas, j'ai:
callBackUrl=http%253A%252F%252Fadbc.com%252FPOSM%252Fapp%252Fpages%252Fadf.task-flow%253Fadf.tfDoc%253D%25252FWEB-INF%25252Ftask-flows%25252Fcatalog-edit-task-flow.xml%2526adf.tfId%253Dcatalog%2526_adf.ctrl-state%253Db9akorh22_9%2526articleReference%253D10C00135%2526previousView%253Dcatalog-home%2526fromUCM%253Dtrue%2526articleType%253Dposm%2526developer%253Dcentral
Maintenant, je prends la valeur de callBackUrl dans ma méthode js, puis je le décode et je tire window.open()
avec cette URL décodée. les paramètres sont les mêmes et il a:
Paramètres en elle. Je sais donc qu'il n'y a pas de chaîne de requête comme value="%.."
.
J'ai écrit la méthode suivante:
var decodeURLRecursively = function(url) {
if(url.indexOf('%') != -1) {
return decodeURLRecursively(decodeURIComponent(url));
}
return url;
}
Décodage répété jusqu'à ce que vous ne trouviez pas de %
les signes fonctionneront plus de 99% du temps. Cela fonctionnera encore mieux si vous appelez à plusieurs reprises tant qu'une correspondance pour /%[0-9a-f]{2}/i
peut être trouvé.
Cependant, si je devais (pour une raison bizarre) nommer un fichier 100%achieved
, cela poserait un problème car %ac
serait décodé en ¬
, entraînant l'échec du décodage. Malheureusement, il n'y a aucun moyen de détecter ce cas.
Idéalement, vous devriez savoir si quelque chose est encodé plus d'une fois, et de manière optimale, vous ne devriez pas le laisser se produire en premier lieu.
Il existe un moyen simple de savoir si une chaîne d'URL est codée.
Prenez la chaîne initiale et comparez-la avec le résultat du décodage. Si le résultat est le même, la chaîne n'est pas codée; si le résultat est différent, il est codé.
J'ai eu ce problème avec mes URL et j'ai utilisé ces fonctions:
function isEncoded(uri) {
uri = uri || '';
return uri !== decodeURIComponent(uri);
}
Alors maintenant, je peux utiliser isEncoded
comme discriminant dans une boucle while (ou avec récursivité) pour savoir si je dois continuer d'appeler decodeURIComponent
sur la chaîne:
function fullyDecodeURI(uri){
while (isEncoded(uri)){
uri = decodeURIComponent(uri);
}
return uri;
}
Cela a résolu pour moi le problème du décodage des URL encodées plusieurs fois. J'espère que cela t'aides.
vous pouvez conserver le décodage jusqu'à ce que la chaîne ne change pas:
str = "xxxxxxx"
dec_str = decode(str)
while(dec_str != str)
str = dec_str;
dec_str = decode(str);
function checkEncodeURI(str) {
return /\%/i.test(str)
}
Test:
let url1 = "https://quora.com/unanswered/I’m-looking-for-a-Freaks-And-Friends-Fox-Glitter-Face-Hinge-Wallet-for-a-Christmas-gift-I’ve-searched-for-hours-online-but-no-one-seemed-to-have-it-does-anyone-know-where-I-can-find-one"
let url2 = 'https://www.quora.com/unanswered/I%E2%80%99m-looking-for-a-Freaks-And-Friends-Fox-Glitter-Face-Hinge-Wallet-for-a-Christmas-gift-I%E2%80%99ve-searched-for-hours-online-but-no-one-seemed-to-have-it-does-anyone-know-where-I-can-find-one'
let a = checkEncodeURI(url1)
console.log(a)
let b = checkEncodeURI(url2)
console.log(b)