Отключение фильтра перенаправления шва - PullRequest
7 голосов
/ 10 января 2009

Я делаю проект в шов, который требует спокойных URL. У меня есть представление, которое сопоставлено с / group / {group} / {locale}. На этой странице у меня есть список так называемых сообщений. Каждое сообщение имеет кнопку для сохранения изменений в сообщении. Это связано с компонентом действия следующим образом:

<h:commandButton type="submit" value="Save Changes" action="#{groupAction.update}" />

Каждое сообщение имеет привязку, поэтому / group / {group} / {locale} # {id} можно использовать, чтобы браузер перешел на эту привязку. Вот почему мне нужен редирект после POST:

<page view-id="/group.xhtml">
  <rewrite pattern="/group/{group}/{locale}"/>

  <param name="group" value="#{groupAction.group}"/>
  <param name="locale" value="#{groupAction.locale}"/>

  <navigation from-action="#{groupAction.update}">
    <redirect view-id="/group.xhtml?group=#{group}&locale=#{locale}##{id}"/>
  </navigation>
</page>

Также у меня есть следующее правило перенаправления (UrlRewriteFilter), чтобы получить правильный RESTful URL:

<outbound-rule>
  <from>^/group.xhtml\?group=([\.\w]+)&locale=([\.\w]+)\#([\.\w]+)\?cid=(\d*)$</from>
  <to type="temporary-redirect" last="true">/group/$1/$2#$3</to>
</outbound-rule>

Я раздеваю разговор. Это было проверено и работает. Однако к шву все еще добавляется '? Разговорный идентификатор = {cid}'. Так в чем проблема? Что ж, представьте себе URL-адрес типа «/ group / {group} / {locale} # {id}? РазговорId = {cid}». Очевидно, что браузер не любит это и не будет автоматически переходить на этот якорь.

Я провел некоторое исследование и обнаружил свою проблему в документации по шву:

29.1.4.2. Распространение разговора с перенаправлениями Этот фильтр позволяет Seam распространять контекст разговора через перенаправления браузера. Он перехватывает любой браузер, перенаправляет и добавляет параметр запроса, который определяет идентификатор диалога Seam. Фильтр перенаправления будет обрабатывать все запросы по умолчанию, но это поведение также можно настроить в файле components.xml:

<web:redirect-filter url-pattern="*.seam"/>

Мне не нужен фильтр перенаправления, и я попытался поместить что-то недопустимое в шаблон URL, чтобы «отключить» фильтр. Однако это не сработало. Итак, мой вопрос сейчас:

Как отключить фильтр перенаправления в шве?

Я не могу найти ответ. В документации по шву говорится о его отключении в web.xml, но мои попытки пока не увенчались успехом.

Ответы [ 2 ]

7 голосов
/ 13 января 2009

Я выяснил, откуда исходит нежелательный параметр строки запроса conversationId.

<redirect/> приводит к вызову org.jboss.seam.faces.FacesManager.redirect(String viewId, Map<String, Object> parameters, boolean includeConversationId)

Это вызывается из следующего кода в org.jboss.seam.faces.Navigator, который устанавливает includeConversationId в true:

  FacesManager.instance().redirect(viewId, parameters, true);

Я не вижу способа избежать этого, поэтому исправление / обходной путь заключается в том, чтобы программно выполнить перенаправление в методе действия с помощью:

  FacesManager.instance().redirect(viewId, parameters, false);
1 голос
/ 12 января 2009

ОК, мне удалось убить фильтр перенаправления, добавив его в мой componentonents.xml:

<web:redirect-filter disabled="true" installed="false" />

Однако моя главная проблема все еще существует, так что, видимо, это была не проблема. Он по-прежнему добавляет разговор в качестве дополнительной строки запроса в URL. По-видимому, я делаю что-то не так, поскольку это было сделано раньше .

@ Адель Ансари:

components.xml:

 <web:rewrite-filter view-mapping="/seam/*" />

pages.xml см. Мой начальный вопрос.

...