Spring Webflow 2和可收藏的URL

时间:2012-11-29 12:55:42

标签: spring seo friendly-url deep-linking spring-webflow-2

目前由于Post / Redirect / Get模式,所有流URL都类似<site_url>/flow_name?execution=?,并且不保留输入GET参数。因此,用户无法复制网址或将其加入书签。

有什么建议可以整齐地完成吗?

2 个答案:

答案 0 :(得分:1)

我们可以通过自定义SWF API的 FlowHandlerAdapter 来为基于SWF的应用程序的URL添加书签。

以下是一个示例:

我的SWF配置文件将包含:

<bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
      <property name="flowHandlerAdapter" ref="customFlowHandlerAdapter" /> 
     </bean>

     <bean id="customFlowHandlerAdapter" class="com.xyz.CustomFlowHandlerAdapter">
        <property name="flowExecutor" ref="flowExecutor" /> 
        <property name="flowUrlHandler" >
            <bean class="com.xyz.CustomURLFlowHandler" /> 
        </property>
     </bean>

我的CustomFlowHandlerAdapter将具有:

public class CustomFlowHandlerAdapter extends FlowHandlerAdapter {

...

@Override
    public ModelAndView handle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        FlowHandler flowHandler = (FlowHandler) handler;
        checkAndPrepare(request, response, false);
        String flowExecutionKey = this.getFlowUrlHandler()
                .getFlowExecutionKey(request);
        if (flowExecutionKey != null)
            try {
                ServletExternalContext context = createServletExternalContext(
                        request, response);
                FlowExecutionResult result = this.getFlowExecutor().resumeExecution(
                        flowExecutionKey, context);
                handleFlowExecutionResult(result, context, request, response,
                        flowHandler);
            } catch(org.springframework.webflow.execution.repository.NoSuchFlowExecutionException ex){
                response.sendRedirect(request.getRequestURI());
            } catch(org.springframework.webflow.execution.repository.BadlyFormattedFlowExecutionKeyException ex){
                response.sendRedirect(request.getRequestURI());
            } catch (FlowException e) {
                handleFlowException(e, request, response, flowHandler);
            }
....

这里我捕获NoSuchFlowExecutionException并重定向到没有任何参数的确切流URL。在这里,您可以捕获并重新包含参数

因此,我能够从任何状态为我的URL添加书签(总是从第一个开始流程),如果需要,我也可以发送自己的参数。

答案 1 :(得分:0)

您始终可以使用链接指向您的某个流程起点的链接。
例如,您可以<site_url>/flow_name?personId=123&projectId=456假设您有两个输入流personId和{{1} }}。但是需要知道网址(您必须将其提供给用户),您不能使用地址栏上的网址。

即使你想这样做,你也无法使用和标记链接到流中特定状态的链接(除非你在流程的开头添加一些逻辑,以引导你到特定的事件取决于关于输入的值)。