Javascript 如何知道URL是否已解码/编码?
我正在使用Javascript方法Javascript 如何知道URL是否已解码/编码?,javascript,urlencode,urldecode,Javascript,Urlencode,Urldecode,我正在使用Javascript方法decodeURIComponent对编码的URL进行解码。现在我遇到了一个问题,有时URL在服务器之间重定向时会被编码两次,有时只编码一次 我想检查调用方法decodeURIComponent后URL是否仍然编码。我该怎么做?任何指针都会对我很有帮助 更新-1 如果我递归调用一个方法并检查给定的URL是否仍然包含“%”,如果它包含“%”,则对其进行解码并再次调用该方法;如果不把它还给打电话的人,这行吗 更新-2 就我的情况而言,我有: callBackUrl=
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
- 文章参考
- 先前的观点
- 弗洛姆
- 文章类型
- 显影剂
value=“%..”
这样的查询字符串
更新-3
我编写了以下方法:
var decodeURLRecursively = function(url) {
if(url.indexOf('%') != -1) {
return decodeURLRecursively(decodeURIComponent(url));
}
return url;
}
反复解码,直到您没有找到
%
符号为止,将在99%的时间内有效。只要能找到/%[0-9a-f]{2}/i
的匹配项,重复调用就会更好
但是,如果我(出于某种奇怪的原因)命名一个文件100%实现
,这将导致一个问题,因为%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进行解码的问题。希望这有帮助
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)
您可以一直解码,直到字符串没有更改:
str = "xxxxxxx"
dec_str = decode(str)
while(dec_str != str)
str = dec_str;
dec_str = decode(str);
有一种简单、快速、可靠的方法可以知道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
这似乎是一个需要在服务器上解决的问题,而不是在前端对其进行修补。我认为这是不可能的,您可以对字符串进行两次编码。这可能看起来是两倍的编码字符串,也可能是试图发送编码字符串。@elclanrs,这可能是服务器中的问题,但有没有办法检查我的要求?@mishik我已经更新了我的问题,你能看一看吗?@TapasBose如果你想把
value=%
传递给服务器怎么办?通过反复解码,你指的是一个递归调用?不,我指的是一个do..while
循环。我会尝试一下do..while
,不过我在更新-3中写了一个递归。请看一看,我一般不喜欢递归函数,因为它极易陷入无限循环并破坏调用堆栈。另一方面,无限的do..while
循环将导致浏览器挂起/崩溃,但至少在这样做之前不会消耗所有可用内存。我所做的只是搜索空格()、换行符(\n)、回车符(\r)和标记符(\t)。在我的例子中,我希望通过浏览器地址栏执行JavaScriptjavascript:alert('test string')
这对我来说已经足够了。Thx,帮了我很多忙:)如果解码的url文件名中有%20之类的内容,它仍然不起作用。1行版本:const isEncoded=uri=>uri!==解码组件(uri | |“”)