Spring webflow从外部链接启动流程和事件(例如确认电子邮件)

时间:2014-06-16 08:21:51

标签: spring spring-mvc spring-webflow

当用户注册新帐户时,应用会发送确认电子邮件。该电子邮件包含一个链接,该链接必须为具有多个事件的流启动特定的eventId。链接重定向正确到流,但我没有在确认eventId上获得此流程启动,始终在第一个eventId上启动,称为登录。

url: .... aio / spring / login?_eventId =确认& code = cmFmYWVscnVpenRhYmFyZXNAZ21haWwuY29t

我已经阅读了使用externalRedirect和其他命令编写流程规则的可能解决方案,但我不需要那样。

登录流程

    <view-state id="login" view="login.xhtml">
    <transition on="entry" to="connect"/>
    <transition on="recoveryPass" to="recovery" />
</view-state>

<action-state id="connect">
    <evaluate expression="login.connect()" />
    <transition on="yes" to="finish" />
    <transition on="no" to="login" />
</action-state>

<view-state id="recovery" view="recovery.xhtml" model="loginFields">
    <transition on="return" to="login" />
    <transition on="sendPass" to="recoveryPass" />
</view-state>

<action-state id="recoveryPass">
    <evaluate expression="login.recoveryPass()" />
    <transition on="yes" to="login" />
    <transition on="error" to="error" />
</action-state>

<action-state id="confirmation">
    <on-entry>
        <set name="confirmationCode" value="requestParameters.code" type="string" />
    </on-entry>

    <evaluate expression="login.confirmation(confirmationCode)" />
    <transition on="yes" to="confirmationOk" />
    <transition on="no" to="noUserFound" />
    <transition on="error" to="error" />
</action-state>

<view-state id="confirmationOk" view="confirmation.xhtml">
  <!--<set name="viewScope.code" value="found" />  -->  
</view-state>

<view-state id="noUserFound" view="confirmation.xhtml">
    <!--<set name="viewScope.code" value="notFound" />-->  
</view-state>

<end-state id="finish" />

<subflow-state id="error" subflow="error">

</subflow-state>

2 个答案:

答案 0 :(得分:2)

eventId与state id不同 - 在正在进行的流的当前状态(操作/视图)中转换所需的eventId,而不是用于启动新流。您登录登录的原因可能是login-flow xml可能映射到/ login映射,而view login状态是id登录是登录流程的开始状态(默认情况下,流定义文件中的第一个状态将是启动状态) 。您需要将启动状态的决策状态重定向到基于某些条件参数的状态,无论您是否需要进入登录状态或确认状态。

修改

例如,如果代码参数仅在来自电子邮件的请求时出现,那么您的流程定义可能如下:

    <flow xmlns="http://www.springframework.org/schema/webflow"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/webflow
        http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">

    <input name="code" type="java.lang.String">

    <decision-state id="checkFlowStart">
        <if test="code == null" then="login" else="confirmation"/>
    </decision-state>

    <view-state id="login" view="login.xhtml">
        <transition on="entry" to="connect"/>
        <transition on="recoveryPass" to="recovery" />
    </view-state>
    ....

答案 1 :(得分:0)

您是否考虑将特定状态(在该状态下实施)作为不同的流程。在主流程中使用时,它可以用作子流程,而它也可以自由地作为单独的流程启动。 来自主流的参数可以作为输入传递给子流。以下是我试图解释自己的一个例子

Main Flow
<view-state></view-state>
<action-state></action-state>
<!-- This is the re-usable flow which can be used within this flow and can be
launched independently -->
<sub-flow>
  <input/>
</sub-flow>

Another spring flow - can be plugged in from another flow or used independently
<input/>
<action-state></action-state>
<end-state></end-state>