我正在尝试创建a signature for the JW Platform API。它需要一个名为“api_signature”的URL参数,该参数是每个其他URL参数的SHA1摘要。
我尝试使用SHA1
摘要动态创建参数,并输入JS Script
。这是JS Script的基本代码:
function evaluate(context)
{
var request = context.getCurrentRequest()
var params = request.getUrlParameters()
var sbs = ''
for (key of params) {
if (key === 'api_signature')
continue;
if (sbs.length > 0)
sbs += '&'
sbs += encodeURIComponent(key) + '=' + encodeURIComponent(params[key])
}
return sbs + '<API SECRET GOES HERE>'
}
但有了这个,我得到警告:
JS Script不能在URL参数值中使用,因为这会创建一个自我依赖。
我怎样才能解决这个问题?
答案 0 :(得分:4)
出现此警告的原因是request.getURLParameters()
必须评估请求的所有url参数,包括api_signature
,因此必须调用JS脚本的方法评估,从而创建无限在第一次迭代时检测到并阻止的递归问题(危险的url参数的内容被''
替换)。
理论上,可以通过使用request.getURLParameters(true)
来避免此问题,request.getURLParametersNames()
为每个url参数返回未评估的DynamicString。然而,在实践中,似乎检测有点过于强烈,它仍然会引发警告。
另一种解决方案可能是同时使用request.getURLParameterByName(name)
和function evaluate(context)
{
var request = context.getCurrentRequest()
var params = request.getUrlParameters(true)
var sbs = []
for (var key in params) {
if (key === 'api_signature')
continue;
sbs.push(encodeURIComponent(key) + '=' +
encodeURIComponent(params[key].getEvaluatedString()))
}
return sbs.join('&') + '<API SECRET GOES HERE>'
}
。但是,检测结果太强,并且会发出警告。
这两种解决方案在理论上都应该工作而不会发出警告,我们正在为Paw 3.0.13中的这个问题进行修复。在任何情况下,虽然会引发警告,但脚本仍能正常运行。
function evaluate(context)
{
var request = context.getCurrentRequest()
var params = request.getUrlParametersNames()
var sbs = []
for (var param of params) {
if (param === 'api_signature')
continue;
sbs.push(encodeURIComponent(param) + '=' +
encodeURIComponent(request.getUrlParameterByName(param)))
}
return sbs.join('&') + '<API SECRET GOES HERE>'
}
public static void main (String[] args) throws java.lang.Exception{
boolean abort = false;
while (!abort){
if (false) {
abort = true;
continue;
}
String test = "stupid";
if (test.equals("stupid")) {
System.out.println(test);
break;
}
}
}