31

decodeURIComponentエンコードされた URL をデコードするためにJavascript メソッドを使用しています。現在、サーバー間のリダイレクト中に URL が 2 回エンコードされることもあれば、1 回だけエンコードされることもあるという問題があります。

メソッドを呼び出した後、URL がまだエンコードされているかどうかを確認したいdecodeURIComponent。どうやってやるの?どんなポインタでも私にとって非常に役に立ちます。

アップデート - 1

メソッドを再帰的に呼び出して、指定された URL にまだ「%」が含まれているかどうかを確認し、「%」が含まれている場合はそれをデコードしてメソッドを再度呼び出します。それを呼び出し元に返さない場合、それは機能しますか?

アップデート - 2

私の場合、私は持っています:

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 の値を取得し、それをデコードしてwindow.open()、そのデコードされた URL で起動しています。パラメータは同じで、次のものがあります。

  • adf.tfDoc
  • adf.tfId
  • 記事参照
  • 前のビュー
  • 国名、県名UCM
  • 記事の種類
  • デベロッパー

それにパラメータ。だから私はのようなクエリ文字列がないことを知っていますvalue="%.."

アップデート - 3

私は次の方法を書きました:

var decodeURLRecursively = function(url) {
    if(url.indexOf('%') != -1) {
        return decodeURLRecursively(decodeURIComponent(url));
    }

    return url;
}
4

5 に答える 5

43

URL 文字列がエンコードされているかどうかを確認する簡単な方法があります。

最初の文字列を取得し、それをデコードした結果と比較します。結果が同じ場合、文字列はエンコードされていません。結果が異なる場合は、エンコードされます。

URLにこの問題があり、この関数を使用しました:

function isEncoded(uri) {
  uri = uri || '';

  return uri !== decodeURIComponent(uri);
}

これで、while ループ (または再帰) で判別式として使用して、文字列isEncodedを呼び出し続ける必要があるかどうかを知ることができます。decodeURIComponent

function fullyDecodeURI(uri){

  while (isEncoded(uri)){
    uri = decodeURIComponent(uri);
  }

  return uri;
}

これにより、複数回エンコードされた URL をデコードするという問題が解決されました。お役に立てれば。

于 2016-07-08T11:07:22.800 に答える