Login 为未经身份验证的用户打开XPage(单页应用程序)到特定锚(appPage)

Login 为未经身份验证的用户打开XPage(单页应用程序)到特定锚(appPage),login,anchor,xpages,Login,Anchor,Xpages,我有一个移动XPages应用程序,它使用XPages扩展库的单页应用程序控件(xe:singlePageApp)。该应用程序还使用一个工作流引擎,向用户发送带有文档链接的电子邮件,以便用户批准请求 链接URL的组成如下 http://hostname/app.nsf/m_page.xsp?action=openDocument&documentId=2A2A#requestForm http://hostname/app.nsf/m_page.xsp?action=openDocument&do

我有一个移动XPages应用程序,它使用XPages扩展库的单页应用程序控件(xe:singlePageApp)。该应用程序还使用一个工作流引擎,向用户发送带有文档链接的电子邮件,以便用户批准请求

链接URL的组成如下

http://hostname/app.nsf/m_page.xsp?action=openDocument&documentId=2A2A#requestForm http://hostname/app.nsf/m_page.xsp?action=openDocument&documentId=2A2A#requestForm 其中,
requestForm
是包含要显示单个请求文档的表单的appPage的名称

如果用户已登录,浏览器将打开并按预期显示文档

但是,如果用户尚未登录,将显示Domino登录表单(基于会话的身份验证)。当用户随后登录时,会打开相同的XPage,但会打开到默认页面(singlePageApp的selectedPageName属性),而不是带有pageName
requestForm
的appPage。这种行为的原因是,在提交登录表单后,锚定部分(
#requestForm
)不再出现在浏览器重定向到的URL中,因为
#requestForm
-部分从未发送到首先计算重定向URL的服务器

我能想到的可能解决办法是

  • 将预期的pageName放入真实的URL参数(如documentId),解析URL并修改浏览器位置(从…&documentId=2A2A&pageName=requestForm到…&documentId=2A2A\requestForm)
  • 检查URL是否存在documentId参数,如果存在,则修改浏览器位置(添加#requestForm)
  • 按照修改Domino登录表单(这是不允许的)

我想知道现在是否有更优雅的解决方案。

对于您的情况,我会选择第一个选项。但我不会在客户端处理url更改,而是在服务器端处理。否则,客户端将加载初始页面一次,并向服务器提交额外的请求

beforePageLoad
事件中:

var url:XSPUrl=context.getUrl();

if(url.hasParameter("pageName")) {
    var pageName=url.getParameter("pageName");
    url.removeParameter("pageName");
    facesContext.getExternalContext().redirect(url.toString()+"#"+pageName)
}

这将在加载页面之前进行重定向。

非常感谢,同时我也选择了该选项。没有抽出时间用代码更新帖子,但你的比我的更优雅:-)我只是希望有一个更通用的解决方案,不需要这样的解决方法。只要存在某种重定向(如登录表单),就不会有通用的解决方案。Jake的解决方案也很好,尤其是在您无法控制生成的URL的情况下。但是,使用与管理相关的东西来解决与开发人员相关的问题对我来说不是一个好做法:)