0

我在不同的自定义控件中有两个按钮,它们在它们的 onclick 事件中调用 context.redirectToPage()。在一种情况下,这会导致 HTTP 重定向(HTTP 状态为 302)到预期的 URL(即标头 Location = http://frontend.company.com/path/to/file.nsf/myXpages.xsp?documentId=C699C5D6E81721EA85257A2F00683319&openDocument) . 在另一个例子中,它返回一个像这样的标签:

<script>window.location.href='http://backend.company.com:81/path/to/file.nsf/myXpage.xsp?documentId=C699C5D6E81721EA85257A2F00683319&openDocument'</script>

两个实例都有 submit=true、refresh=complete 和 immediate=true。两者都有正确执行的客户端脚本和在重定向调用之前执行的几行 SSJS。我能想到的唯一可能导致这种情况的区别是返回脚本的按钮位于 (xe:dialog) 中。

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

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

谢谢,

富有的

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

<xp:button
                id="errorReloadButton"
                value="Reload Page">

                <xp:this.rendered><![CDATA[#{javascript:whichButton == "reload"}]]></xp:this.rendered>
                <xp:eventHandler
                    event="onclick"
                    submit="true"
                    refreshMode="complete"
                    immediate="true">
                    <xp:this.action>
                        <xp:actionGroup>

                            <xp:executeScript>
                                <xp:this.script><! [CDATA[#{javascript:sessionScope.remove("errors");
var c = getComponent("errorDialog")
c.hide();
var redirectTarget = view.getPageName() + '?documentId=' + compositeData.docID + '&openDocument';
context.redirectToPage(redirectTarget,true);
}]]></xp:this.script>
                            </xp:executeScript>
                        </xp:actionGroup>
                    </xp:this.action>
                    <xp:this.script>
                        <xp:executeClientScript>
                            <xp:this.script><![CDATA[setClean("#{javascript:compositeData.docID}");
XSP._setDirty(false,"");]]></xp:this.script>
                        </xp:executeClientScript>
                    </xp:this.script>
                </xp:eventHandler>
            </xp:button>

编辑 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>
4

1 回答 1

1

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

 facesContext.getExternalContext().redirect( "http://stackoverflow.com" );

或者您必须使用反向代理修改 HTTP 响应。

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

编辑:

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

在大多数情况下,返回的 Javascript 将不会被执行,因为响应中的标头,它被更早地解析(并强制重定向)。

As I written above, the best approach is to change the reverse proxy configuration. Alternativly you could change the server to use the external name. Or return the external address in the button code.

于 2013-03-22T08:05:43.770 回答