Как обнаружить перенаправление в слушателе Spring Web Flow? - PullRequest
1 голос
/ 23 января 2011

У меня есть веб-приложение, написанное с использованием Spring Framework, Velocity и (частично) Spring Web Flow.

Чтобы обеспечить общий набор ссылок на всех моих веб-страницах для моего шаблона скорости, яя написал FlowExecutionListener, который выглядит следующим образом:

@Override
public void requestSubmitted(RequestContext context)
{
 Map<String, Object> model = new HashMap<String, Object>();
 populateModel(model);
 context.getRequestScope().putAll(new LocalAttributeMap(model));
}

Затем я могу получить доступ к ключам, хранящимся в модели, в качестве ссылок Velocity, например, $reference.В общем, это прекрасно работает.

Однако некоторые точки выхода из потока будут перенаправлены на запрос GET, например:

<view-state id="startOver" view="redirect:/new"/>

Эти перенаправления будут выполнять 302 для нового запроса со всеми включенными атрибутами запроса.в параметры URL, в результате чего получается большой громоздкий URL вместо чистого /new URL-адреса, на который я пытался перенаправить.

Я хотел бы обнаружить в приемнике, когда поток возвращает перенаправление, чтобыМожно пропустить сохранение строк в атрибутах запроса.(Я делаю это с помощью перехватчика со стандартным Spring MVC, сопоставляя, начинается ли имя представления с «redirect:»).Но мне кажется, что я не могу найти способ в слушателе обнаружить это.

Альтернативно, существуют ли другие способы запрета размещения атрибутов запроса на URL после перенаправления?

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Вы можете использовать пользовательский FlowUrlHandler, который создает URL для перенаправления. Лучший способ понять, как это реализовать, - взглянуть на код DefaultFlowUrlHandler, но основная проблема для вас - отфильтровать входные данные из flowDefinitionUrl, например:

class MyFlowHandlerAdapter extends DefaultFlowHandlerAdapter {
  public String createFlowDefinitionUrl(String flowId, AttributeMap input, HttpServletRequest request) {
    MuttableAttributeMap filteredInput = new MuttableAttributeMap(input);
    // remove the velocity parameters
    filteredInput.remove("velocity.param1");
    // build the url
    return super.createFlowDefinitionUrl(flowId,filteredInput,request);
  }

}

Чтобы использовать его, используйте эту конфигурацию Spring:

<bean id="myFlowUrlHandler" class="com.myapp.MyFlowHandlerAdapter">

<!-- Dispatches requests mapped to flows to FlowHandler implementations -->
<bean id="flowHandlerAdapter" class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
  <property name="flowExecutor" ref="flowExecutor" />
  <property name="flowUrlHandler" ref="myFlowUrlHandler" />
  <property name="requireSession" value="true" />
</bean>
0 голосов
/ 24 января 2011

Какую версию Spring webflow вы используете?

Я работал над 1.0.5, и у него есть атрибут с именем alwaysRedirectOnPause , который выдает перенаправления. Вы можете установить это в false, используя тег что-то вроде этого

<flow:alwaysRedirectOnPause value="false"/>

Также вы можете прочитать более подробную информацию о том, как это поведение перенаправления помогает вам при повторных отправках в Понимание alswaysRedirectOnPause

Я думаю, что даже Spring Webflow 2 имеет похожий атрибут, но я не знаю точного синтаксиса.

Надеюсь, это поможет.

...