【发布时间】:2016-01-14 08:38:31
【问题描述】:
我已将 oAuth2(Facebook、LinkedIn 等)与我的 XPages 应用程序集成,以允许身份验证轻松添加 cmets(响应文档)。当用户进行身份验证时,它必须重定向到 facebook/linkedin 页面,然后返回以完成文档创建。我使用状态变量来执行此操作,并将其传递到 url 的查询字符串中。当页面重新加载并看到状态变量时,它会调用“beforePageLoad”事件并在用户通过身份验证并拥有正确的状态文档时创建响应文档。
我的问题是查询字符串中已经有一个状态参数。我想替换该值,而不是将其添加到末尾。我在这里使用ellemayo 的stackOverflow 解决方案,称为updateQueryStringParameter。当我从我的 beforePageLoads 调用它时,它会运行,但从不替换参数,它只会将它附加到末尾。我最终得到 ...&state=E5A&state=E5F
我有一种感觉,它在排队,
return uri.replace(re, '$1' + key + "=" + value + '$2');
我可以使用@ReplaceSubstring() 等编写代码,但想知道在 XPages SSJS 中运行正则表达式是否有问题。我在 Lotus.com 上看到
可以将正则表达式指定为服务器端,它使用 Java (java.util.regex) API 或客户端,使用浏览器 JavaScript 正则表达式引擎。客户端和服务器端 正则表达式语法类似,但有区别的是 用户必须知道。
我应该避免在 XPages 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;
}
}
【问题讨论】:
-
使用简单的正则表达式是可以的,因为 Java 和 JS 正则表达式引擎确实有一些常见的正则表达式功能(不是全部,差异很大)。因此,如果查询字符串参数不存在,则在其前面添加,如果存在则更新。你说
updateQueryStringParameter不行? -
updateQueryStringParameter 追加而不是替换,并且控制台上没有错误消息。
-
如果您在 beforePageLoad 事件中硬编码新的 URI,您能否澄清它是否按预期工作?如果是,则问题出在正则表达式上。如果不是,则有不同的解释,我怀疑这可能是原因。
-
是的,我已尝试对其进行硬编码。但是,我希望能够传递带有所有值的查询字符串,这就是我需要替换解决方案的原因。我希望我会写一个@function 解决方案。
-
function seems to work,所以不是正则表达式错误。
标签: regex xpages xpages-ssjs