Какво може да направи поведението на context.redirectToPage различно

Имам два бутона в различни персонализирани контроли, които в рамките на техните събития onclick извикват context.redirectToPage(). В един случай това причинява HTTP пренасочване (статус на HTTP 302) към очаквания URL (т.е. местоположение на заглавката = 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>

person Richard Irwin    schedule 21.03.2013    source източник
comment
Предполагам, че говорите за две различни бази данни. Погледнете в xsp.properties за param xsp.redirect, който контролира пренасочването. Повече информация google или тук: xpageswiki.com/ web/youatnotes/wiki-xpages.nsf/   -  person Frantisek Kossuth    schedule 22.03.2013
comment
не, всичко това е в една база данни, всъщност на една и съща xpage, но в различни персонализирани контроли. В един случай генерира 302, а в друг връща маркер на скрипт.   -  person Richard Irwin    schedule 22.03.2013
comment
Вградете източници за двата бутона, техните събития трябва да се различават :-)   -  person Frantisek Kossuth    schedule 22.03.2013
comment
redirectToPage: бутон 1 -› (url,true), бутон 2 -› (url). Според документи (publib.boulder.ibm.com/infocenter/domhelp/v8r0/), вероятно отрича стойността по подразбиране - параметър, който споменах...   -  person Frantisek Kossuth    schedule 23.03.2013
comment
Всъщност този втори параметър току-що беше добавен като част от процеса на отстраняване на грешки. Проверих, че премахването му или промяната на стойността му не променя резултата.   -  person Richard Irwin    schedule 23.03.2013


Отговори (1)


Има два начина за коригиране на вашите проблеми: Можете да кодирате твърдо пренасочването към новия URL адрес, напр.

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

Или трябва да промените HTTP отговора с вашия обратен прокси.

Последният вариант е по-добрият, защото това ще засегне и всички частични опреснявания. Има допълнителна HTTP заглавка X-XspLocation, която съдържа целевия URL адрес, който трябва да бъде модифициран.

РЕДАКТИРАНЕ:

скриптът е в (xe:dialog). -> Това е причината. Моя грешка, не съм чел тази информация. Събитията в xe:dialog ще бъдат принудени да се опресняват частично, в противен случай няма да работят „в диалоговия прозорец“. Това засяга всички пренасочвания, те винаги ще връщат Javascript и заглавка X-XspLocation с целта.

В повечето случаи върнатият Javascript няма да бъде изпълнен поради заглавката в отговора, която е анализирана по-рано (и принуждава пренасочване).

Както писах по-горе, най-добрият подход е да промените конфигурацията на обратния прокси. Като алтернатива можете да промените сървъра да използва външното име. Или върнете външния адрес в кода на бутона.

person Sven Hasselbach    schedule 22.03.2013
comment
Току-що се опитах да заменя извикването на context.redirectToPage() с faces.getExternalContext().redirect(), но с подобни резултати, също генерирайки таг на скрипт. - person Richard Irwin; 22.03.2013
comment
@RichardIrwin: Можете ли да публикувате кодовете на бутоните към вашия въпрос? - person Sven Hasselbach; 22.03.2013
comment
Е, това е просто жалко тогава... Не успях да накарам прокси сървъра да коригира URL адреси в тялото на маркера на скрипта (mod_proxy_html изглежда просто променя URL адресите в атрибута src, но може би просто не можах да намеря правилната настройка) . Моето решение беше да заменя context.redirectToPage() със собствен скрипт onComplete от страна на клиента в манипулатора на събития, използвайки window.location.path, за да ми позволи да използвам URL адреси, свързани със сървъра. - person Richard Irwin; 25.03.2013