如何在Spring Web Flow监听器中检测重定向?

时间:2011-01-23 00:23:37

标签: java spring-webflow

我有一个使用Spring Framework,Velocity和(部分)Spring Web Flow编写的webapp。

为了在我的速度模板的所有网页中提供一组通用的引用,我编写了一个FlowExecutionListener,如下所示:

@Override
public void requestSubmitted(RequestContext context)
{
 Map<String, Object> model = new HashMap<String, Object>();
 populateModel(model);
 context.getRequestScope().putAll(new LocalAttributeMap(model));
}
然后,我可以访问存储在模型中的密钥作为速度参考,例如$reference。 总的来说,这很有效。

但是,流中的某些退出点将重定向到GET请求,如下所示:

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

这些重定向将对新请求执行302操作,并将所有请求属性转换为网址参数,从而导致网址过大而不是我尝试重定向到的干净/new网址。

我想在侦听器中检测到流返回重定向时,以便我可以跳过在请求属性中存储字符串。 (我通过匹配视图名称是否以“redirect:”开头)来使用标准Spring MVC的拦截器执行此操作。但我似乎无法在听众中找到一种方法来检测这一点。

或者,还有其他方法可以阻止在重定向后将请求属性放在URL上吗?

2 个答案:

答案 0 :(得分:2)

您可以使用自定义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>

答案 1 :(得分:0)

您使用的是哪个版本的Spring webflow?

我已经使用过1.0.5并且它有一个名为 alwaysRedirectOnPause 的属性,它会发出重定向。你可以使用像这样的标签

将其设置为false
<flow:alwaysRedirectOnPause value="false"/>

此外,您还可以阅读有关此重定向行为如何帮助您进行重复提交的详细信息 在Understanding alswaysRedirectOnPause

我认为即使是Spring webflow 2也有类似的属性,但我不知道确切的语法。

希望这有帮助。

相关问题