【问题标题】:How to detect redirect in Spring Web Flow listener?如何在 Spring Web Flow 监听器中检测重定向?
【发布时间】:2011-01-23 00:23:36
【问题描述】:

我有一个使用 Spring Framework、Velocity 和(部分)Spring Web Flow 编写的 web 应用程序。

为了在我的所有网页中为我的速度模板提供一组通用引用,我编写了一个 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,所有请求属性都转换为 URL 参数,从而导致一个大而笨重的 URL,而不是我试图重定向到的干净的 /new url。

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

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

【问题讨论】:

    标签: java spring-webflow


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      我在 1.0.5 上工作过,它有一个名为 alwaysRedirectOnPause 的属性,它发出重定向。您可以使用类似这样的标签将其设置为 false

      <flow:alwaysRedirectOnPause value="false"/>
      

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

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

      希望这会有所帮助。

      【讨论】:

      • 这似乎不是我想要的。它已经在重定向。我只是希望它省略 URL 查询参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 2021-10-05
      • 2021-11-13
      • 2015-08-08
      • 2017-02-08
      相关资源
      最近更新 更多