0

onclick イベント内で context.redirectToPage() を呼び出す、異なるカスタム コントロールに 2 つのボタンがあります。ある例では、これにより、期待される URL への HTTP リダイレクト (HTTP ステータス 302) が発生します (つまり、ヘッダー 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 に直接アクセスできないため、script タグで生成された URL は機能しません。

2 番目のボタンから 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

問題を修正するには、次の2つの方法があります。新しいURL、feへのリダイレクトをハードコーディングできます。

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

または、リバースプロキシを使用してHTTP応答を変更する必要があります。

最後のオプションは、すべての部分的な更新にも影響するため、より適切なオプションです。変更する必要のあるターゲットURLを含む追加のHTTPヘッダーX-XspLocationがあります。

編集:

スクリプトは(xe:dialog)内にあります。->それが理由です。私のせいで、私はこの情報を読んでいません。xe:dialog内のイベントは、部分的な更新を強制されます。そうしないと、「ダイアログ内」で機能しません。これはすべてのリダイレクトに影響し、ターゲットとともに常にJavascriptとX-XspLocationヘッダーを返します。

ほとんどの場合、応答のヘッダーが原因で、返されたJavascriptは実行されません。これは、以前に解析されます(そして、リダイレクトを強制します)。

上で書いたように、最善のアプローチはリバースプロキシ構成を変更することです。または、外部名を使用するようにサーバーを変更することもできます。または、ボタンコードで外部アドレスを返します。

于 2013-03-22T08:05:43.770 に答える