如何知道URL是否被解码/编码?

问题描述 投票:16回答:4

我使用Javascript方法decodeURIComponent来解码编码的URL。现在我遇到了一个问题,有时在服务器之间重定向期间URL被编码两次,有时它只被编码一次。

我想在调用方法decodeURIComponent之后检查URL是否仍然是编码的。我怎样才能做到这一点?任何指针都对我很有帮助。

更新 - 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方法中获取callBack Url的值,然后解码它并使用该解码的URL触发qazxsw poi。参数相同,它有:

  • Odv.tvdk
  • Odv.tefid
  • articleReference
  • previousView
  • fromUCM
  • articleType
  • 开发人员

参数进入它。所以我知道没有像window.open()这样的查询字符串。

更新 - 3

我写了以下方法:

value="%.."
javascript urlencode urldecode
4个回答
7
投票

重复解码,直到你发现没有var decodeURLRecursively = function(url) { if(url.indexOf('%') != -1) { return decodeURLRecursively(decodeURIComponent(url)); } return url; } 标志将超过99%的时间。只要你能找到%的比赛,你就会反复打电话,效果会更好。

但是,如果我(由于一些奇怪的原因)命名文件/%[0-9a-f]{2}/i,这将导致问题,因为100%achieved将被解码为%ac,导致解码失败。不幸的是,没有办法检测到这种情况。

理想情况下,您应该知道某些事物是否被编码不止一次,并且最好不要让它首先发生。


22
投票

有一种简单的方法可以知道URL字符串是否已编码。

获取初始字符串并将其与解码结果进行比较。如果结果相同,则不对字符串进行编码;如果结果不同则编码。

我的网址遇到了这个问题,我使用了这个函数:

¬

所以现在我可以使用function isEncoded(uri) { uri = uri || ''; return uri !== decodeURIComponent(uri); } 作为while循环(或递归)中的判别式来知道我是否需要继续在字符串上调用isEncoded

decodeURIComponent

这解决了我解码多次编码网址的问题。希望这可以帮助。


1
投票

你可以保持解码,直到字符串没有改变:

function fullyDecodeURI(uri){

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

  return uri;
}

0
投票
str = "xxxxxxx"
dec_str = decode(str)
while(dec_str != str)
     str = dec_str;
     dec_str = decode(str);

测试:

function checkEncodeURI(str) {
 return /\%/i.test(str)
}
© www.soinside.com 2019 - 2024. All rights reserved.