Domino中获取URL查询参数marker及移除方法技术咨询
问题分析与解决方案
你的核心问题是代码执行时机错误:按钮的onclick动作在用户点击时立即触发,此时你只是发起了授权重定向流程,用户还没去系统B完成授权,所以marker参数根本不存在;等用户从系统B授权完成、带着marker重定向回你的页面时,页面重新加载,但按钮没有被点击,那段获取参数的代码根本没运行——只有再次点击按钮,才会触发代码去读取已经存在的marker。
要解决这个问题,我们需要把获取并处理marker的逻辑移到页面加载时自动执行,而不是依赖按钮点击;按钮只负责发起授权流程即可。
具体实现步骤
1. 页面加载时自动检查并处理marker参数
在你的Nav2.xsp页面中添加beforePageLoad事件,这个事件会在页面每次加载(包括从系统B重定向回来时)自动触发:
<xp:eventHandler event="beforePageLoad" submit="true" refreshMode="complete"> <xp:this.action><![CDATA[#{javascript: // 检查URL中是否存在marker参数 var marker = param.get("marker"); if (marker) { print("Successfully got marker param: " + marker); // 这里添加你的marker处理逻辑,比如保存到session、调用业务接口等 sessionScope.put("authorizedMarker", marker); // 处理完成后,移除URL中的marker参数,提升用户体验 var currentUrl = context.getUrl().toString(); // 正则表达式移除marker参数(处理单独存在或和其他参数共存的情况) var cleanUrl = currentUrl.replace(/([?&])marker=[^&]+(&|$)/, function(match, prefix, suffix) { // 如果是中间参数,保留前面的&;如果是最后一个参数,去掉多余的?或& return suffix ? prefix : ''; }); // 处理URL末尾可能遗留的? cleanUrl = cleanUrl.replace(/\?$/, ''); // 重定向到干净的URL facesContext.getExternalContext().redirect(cleanUrl); } }]]></xp:this.action> </xp:eventHandler>
2. 简化按钮逻辑,只负责发起授权流程
修改按钮的onclick代码,去掉获取marker的部分,专注于触发授权重定向:
<xp:eventHandler event="onclick" submit="true" refreshMode="complete"> <xp:this.action><![CDATA[#{javascript: var redirectUrl = context.getUrl().toString(); var errorRedirectUrl = context.getUrl().toString(); var EGRZAuthObject = new ru.iteko.egrz.requestprocessors.EGRZAuthorization(); // 只发起授权流程,此时还没有marker参数,无需尝试获取 EGRZAuthObject.initializeAuthProcess(redirectUrl, errorRedirectUrl); }]]></xp:this.action> </xp:eventHandler>
为什么这样有效?
- 当用户第一次点击按钮时:按钮发起授权重定向,用户被带到系统A→系统B完成授权。
- 用户授权完成后:系统B重定向回
Nav2.xsp?marker=xxx,此时页面的beforePageLoad事件自动触发,检测到marker参数并处理,然后重定向到不带marker的干净URL。 - 整个过程无需用户再次点击按钮,完全自动处理
marker参数。
额外注意点
确保你在调用initializeAuthProcess时传入的redirectUrl就是Nav2.xsp的完整URL,这样系统B才能正确把用户重定向回这个页面,让beforePageLoad事件能捕获到marker参数。
内容的提问来源于stack exchange,提问作者Rus9Mus9
相关产品推荐
相关产品推荐

