【问题标题】:How to know if a URL is decoded/encoded?如何知道 URL 是否被解码/编码?
【发布时间】:2013-07-08 00:57:57
【问题描述】:

我正在使用 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 方法中获取 callBackUrl 的值,然后对其进行解码并使用解码后的 URL 触发 window.open()。参数相同,并且具有:

  • adf.tfDoc
  • adf.tfId
  • 文章参考
  • 上一页查看
  • 来自UCM
  • 文章类型
  • 开发者

参数进去。所以我知道没有像value="%.." 这样的查询字符串。

更新 - 3

我写了如下方法:

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

    return url;
}

【问题讨论】:

  • 似乎是在服务器上修复而不是在前端修补它的问题。
  • 我认为不可能,你可以对一个字符串进行两次编码。这可能看起来像两次编码的字符串或尝试发送编码的字符串。
  • @elclanrs,可能是服务器的问题,但有什么方法可以检查我的要求吗?
  • @mishik 我已经更新了我的问题,你能看一下吗?
  • @TapasBose 如果你想将value=% 传递给服务器怎么办?

标签: javascript urlencode urldecode


【解决方案1】:

重复解码直到找不到% 标志将在 99% 以上的时间内正常工作。只要能找到/%[0-9a-f]{2}/i 的匹配项,反复调用就会更好。

但是,如果我(出于某种奇怪的原因)将文件命名为 100%achieved,则会导致问题,因为 %ac 将被解码为 ¬,从而导致解码失败。不幸的是,没有办法检测到这种情况。

理想情况下,您应该知道某些内容是否被多次编码,并且最好一开始就不要让它发生。

【讨论】:

  • 重复解码是指递归调用?
  • 不,我的意思是 do..while 循环。
  • 我会尝试do..while,但是我在我的更新中写了一个递归 - 3。请看一下。
  • 我一般不喜欢递归函数,因为它非常容易陷入无限循环并炸毁调用堆栈。另一方面,无限的do..while 循环会导致浏览器挂起/崩溃,但至少在这样做之前不会消耗所有可用内存。
  • 我所做的只是搜索 space ( ),line-breaks (\n), carriage-return (\ r) 标记 (\t) 字符。就我而言,我想通过浏览器地址栏执行 JavaScript。 javascript:alert('test string') 对我来说已经足够了。
【解决方案2】:

有一个简单的方法可以知道 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 的问题。希望这会有所帮助。

【讨论】:

  • 谢谢,帮了我很多忙 :)
  • 如果您解码的网址在文件名中包含 %20 或其他内容,则仍然无法正常工作。
  • 1行版本:const isEncoded = uri => uri !== decodeURIComponent(uri || '')
【解决方案3】:
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)

【讨论】:

    【解决方案4】:

    你可以一直解码直到字符串没有改变:

    str = "xxxxxxx"
    dec_str = decode(str)
    while(dec_str != str)
         str = dec_str;
         dec_str = decode(str);
    

    【讨论】:

      【解决方案5】:

      确实有一种简单、快速且值得信赖的方法来了解 URL 字符串是否已编码。

      例如: decodeURIComponent(decodeURIComponent(encodeURIComponent("SWQgPSA0NjI%3D"))) "SWQgPSA0NjI=" ----> 不等于原始值然后已经编码

      只有这段代码:

        var encValue = encodeURIComponent(Value);
          try {
               if (decodeURIComponent(decodeURIComponent(encValue)) === Value) {
                //not encodec yet...so return encoded of val
                return encValue;
               }
             } catch (err) {
                 //not encodec yet...so return encoded of val
                 return encValue;
             }
      
       return Value  //same value returned
      
                              
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        • 2011-01-18
        • 1970-01-01
        相关资源
        最近更新 更多