Xpages 什么可能使context.redirectToPage行为不同

Xpages 什么可能使context.redirectToPage行为不同,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我在不同的自定义控件中有两个按钮,它们在onclick事件中调用context.redirectToPage()。在一个实例中,这会导致HTTP重定向(HTTP状态为302)到预期的URL(即标头位置=)。在另一个实例中,它返回如下标记: <script>window.location.href='http://backend.company.com:81/path/to/file.nsf/myXpage.xsp?documentId=C699C5D6E81721EA85257A2F

我在不同的自定义控件中有两个按钮,它们在onclick事件中调用context.redirectToPage()。在一个实例中,这会导致HTTP重定向(HTTP状态为302)到预期的URL(即标头位置=)。在另一个实例中,它返回如下标记:

<script>window.location.href='http://backend.company.com:81/path/to/file.nsf/myXpage.xsp?documentId=C699C5D6E81721EA85257A2F00683319&openDocument'</script>
window.location.href=http://backend.company.com:81/path/to/file.nsf/myXpage.xsp?documentId=C699C5D6E81721EA85257A2F00683319&openDocument'
两个实例都有submit=true、refresh=complete和immediate=true。两者都有正确执行的客户端脚本和在重定向调用之前执行的几行ssj。我所能想到的唯一可能导致这种情况的区别是,返回脚本的按钮位于(xe:dialog)对话框中

你们中精明的人会注意到为什么这对我来说是个问题,因为我们的Domino服务器在反向代理后面。普通人无法直接访问Domino,因此脚本标记中生成的URL将无法工作

有没有人知道如何从第二个按钮获得302重定向的首选行为,或者甚至有方法让它使用正确的URL?或者甚至可以解释为什么行为会有所不同

谢谢

丰富的

编辑:为context.redirect()生成脚本标记的按钮的代码:


编辑2:正确强制302重定向的按钮的源:

<xp:button
        id="cancelButton"
        value="Cancel"
        rendered="#{javascript:compositeData.documentDataSource.isEditable()}">
        <xp:eventHandler
            event="onclick"
            submit="true"
            refreshMode="complete"
            onError="handleError(arguments[0],arguments[1])"
            immediate="true">
            <xp:this.action>
                <xp:actionGroup>

                    <xp:executeScript>
                        <xp:this.script><![CDATA[#{javascript:var xdoc:NotesXspDocument = compositeData.documentDataSource;
if(xdoc.isNewNote()){  
return;
}
var doc:NotesDocument = xdoc.getDocument(false);
/* more code here, not relevant to this */
var docid = doc.getUniversalID();
context.redirectToPage(view.getPageName() + '?documentId=' + docid + '&openDocument')}]]></xp:this.script>
                    </xp:executeScript>
                </xp:actionGroup>
            </xp:this.action>



            <xp:this.script>
                <xp:executeClientScript>
                    <xp:this.script><![CDATA[setClean("#{javascript:docId(compositeData.documentDataSource)}");
if(#{javascript:compositeData.documentDataSource.isNewNote()}){
popPageStack();
return false;
}]]></xp:this.script>
                </xp:executeClientScript>
            </xp:this.script>
        </xp:eventHandler>
    </xp:button>

有两种解决问题的方法:您可以硬编码重定向到新URL,即f.e

 facesContext.getExternalContext().redirect( "http://stackoverflow.com" );
或者,您必须使用反向代理修改HTTP响应

最后一个选项更好,因为这也会影响所有部分刷新。 还有一个额外的HTTP头X-XspLocation,其中包含必须修改的目标URL

编辑:

脚本位于(xe:dialog)中。->这就是原因。是我的错,我没有阅读这些信息。xe:对话框内的事件将被强制进行部分刷新,否则它们将无法“在对话框内”工作。这会影响所有重定向,它们将始终返回Javascript和带有目标的X-XspLocation头

在大多数情况下,返回的Javascript不会被执行,因为响应中的头会在前面被解析(并强制重定向)


如上所述,最好的方法是更改反向代理配置。或者,您可以将服务器更改为使用外部名称。或者在按钮代码中返回外部地址。

我想您谈论的是两个不同的数据库。查看控制重定向的param xsp.redirect的xsp.properties。更多信息谷歌或这里:不,这是在一个数据库中,实际上在同一个xpage上,虽然在不同的自定义控件中。在一种情况下,它生成302,而在另一种情况下它返回一个脚本标记。嵌入两个按钮的源,它们的事件必须不同:-)redirectToPage:button 1->(url,true),button 2->(url)。根据docs(),它可能会否定默认值-我提到的param…实际上,第二个参数只是作为调试过程的一部分添加的。我已经检查过删除它或更改它的值不会改变结果。只是尝试用faces.getExternalContext().redirect()替换对context.redirectToPage()的调用,但结果类似,也会生成一个脚本标记。@RichardIrwin:你能将按钮代码发布到你的问题中吗?那很不幸。。。我无法让代理服务器修复脚本标记主体内的URL(mod_proxy_html似乎只是修改src属性中的URL,但可能我就是找不到正确的设置)。我的工作是在事件处理程序上使用自己的onComplete客户端脚本替换context.redirectToPage(),使用window.location.path允许我使用服务器相对URL。
 facesContext.getExternalContext().redirect( "http://stackoverflow.com" );