エンコードされたURLをデコードするためにJavaScriptメソッドdecodeURIComponent
を使用しています。サーバー間でのリダイレクト中にURLが2回エンコードされることがある、1回だけエンコードされることがあるという問題が発生しています。
メソッドdecodeURIComponent
を呼び出した後もURLがエンコードされているかどうかを確認したいと思います。どうやってやるの?どんなポインタも私にとって非常に役に立ちます。
メソッドを再帰的に呼び出して、指定されたURLに「%」が含まれているかどうかを確認し、「%」が含まれている場合は、デコードしてメソッドを再度呼び出します。そしてそれを呼び出し元に返さない場合、それは機能しますか?
私の場合、私は:
_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
_
次に、jsメソッドでcallBackUrlの値を取得し、それをデコードして、デコードされたURLでwindow.open()
を起動します。パラメータは同じであり、次のとおりです。
その中にパラメータ。したがって、_value="%.."
_のようなクエリ文字列はありません。
私は次のメソッドを書きました:
_var decodeURLRecursively = function(url) {
if(url.indexOf('%') != -1) {
return decodeURLRecursively(decodeURIComponent(url));
}
return url;
}
_
%
の兆候がなくなるまで繰り返しデコードすると、99%以上の時間で動作します。 /%[0-9a-f]{2}/i
に一致するものが見つかる限り、繰り返し呼び出すとさらに効果的です。
ただし、(奇妙な理由で)ファイルに100%achieved
という名前を付けると、%ac
が¬
にデコードされてデコードが失敗するため、問題が発生します。残念ながら、このケースを検出する方法はありません。
理想的には、何かが複数回エンコードされているかどうかを知る必要があり、最適には、最初にそれが発生しないようにする必要があります。
URL文字列がエンコードされているかどうかを知る簡単な方法があります。
最初の文字列を取得し、デコードした結果と比較します。結果が同じ場合、文字列はエンコードされません。結果が異なる場合は、エンコードされます。
私は私のURLでこの問題があり、私はこの関数を使用しました:
function isEncoded(uri) {
uri = uri || '';
return uri !== decodeURIComponent(uri);
}
文字列でisEncoded
を呼び出し続ける必要があるかどうかを知るために、whileループで(または再帰を使用して)decodeURIComponent
を判別式として使用できるようになりました。
function fullyDecodeURI(uri){
while (isEncoded(uri)){
uri = decodeURIComponent(uri);
}
return uri;
}
これにより、複数回エンコードされたURLをデコードする問題が解決されました。お役に立てれば。
文字列が変更されなくなるまでデコードを続けることができます:
str = "xxxxxxx"
dec_str = decode(str)
while(dec_str != str)
str = dec_str;
dec_str = decode(str);
function checkEncodeURI(str) {
return /\%/i.test(str)
}
テスト:
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)