Что может изменить поведение context.redirectToPage

У меня есть две кнопки в разных пользовательских элементах управления, которые в своих событиях 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 и немедленное=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 параметр 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-адреса внутри тела тега script (mod_proxy_html, похоже, просто изменяет URL-адреса в атрибуте src, но, возможно, я просто не смог найти правильный параметр) . Мой обходной путь заключался в том, чтобы заменить context.redirectToPage() собственным клиентским скриптом onComplete в обработчике событий, используя window.location.path, чтобы позволить мне использовать URL-адреса, относящиеся к серверу. - person Richard Irwin; 25.03.2013