我已将oAuth2(Facebook,LinkedIn等)与我的XPage应用程序集成,以允许身份验证轻松添加注释(响应文档)。当用户进行身份验证时,必须重定向到facebook / linkedin页面,然后返回以完成文档创建。我使用状态变量来执行此操作,并将其传递给url的查询字符串。当页面重新加载并看到状态变量时,它会调用" beforePageLoad"如果用户经过身份验证并具有正确的状态文档,则创建响应文档。
我的问题是查询字符串中已经存在状态参数。我想替换值,而不是将其添加到最后。我在这里使用了一个名为updateQueryStringParameter的ellemayo的stackOverflow解决方案。当我从我的beforePageLoads中调用它时,它会运行,但永远不会替换参数,它只会将它追加到最后。我最终得到......& state = E5A& state = E5F
我感觉它在线,
return uri.replace(re, '$1' + key + "=" + value + '$2');
我可以使用@ReplaceSubstring()等编写代码,但想知道在XPage SSJS中运行正则表达式是否存在问题。我在Lotus.com上读到了
正则表达式可以指定为服务器端,它使用 Java(java.util.regex)API或客户端,它使用浏览器 JavaScript正则表达式引擎。客户端和服务器端 正则表达式语法类似,但有一点不同 用户必须知道。
我应该在XPage SSJS中避免使用正则表达式吗?我在客户端和XPage本身的一些现场验证中广泛使用它。
这是对函数的调用:
if(@Contains( qString,"state=")){
qString=updateQueryStringParameter(qString, "state", linkDoc.getNoteID() );
}else{
qString="?"+qString+"&state=" + linkDoc.getNoteID()
}
功能:
function updateQueryStringParameter(uri, key, value) {
var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
var separator = uri.indexOf('?') !== -1 ? "&" : "?";
if (uri.match(re)) {
// I also tried --> if (re.test(uri)) {
return uri.replace(re, '$1' + key + "=" + value + '$2');
}
else {
return uri + separator + key + "=" + value;
}
}
答案 0 :(得分:1)
这不是XPage或正则表达式问题。我使用Domino提供的查询字符串排除了“?”作为查询字符串的一部分。当我发送“?” + qString函数,它的工作原理。正则表达式需要知道从哪里开始查找,因此它从未找到查询字符串的开头。