我们要求在我们网站的一个小节中对登录和注册的处理略有不同。对于以下每个URI,我们都需要单独的流程。

/登录
/注册
/ subsection /登录
/小节/注册

我们的流注册表使用webflow文档中的位置模式进行配置:

   <flow:flow-registry id="flowRegistry" base-path="/WEB-INF/flow" flow-builder-services="flowBuilderServices">
      <flow:flow-location-pattern value="/**/*-flow.xml" />
   </flow:flow-registry>


流XML文件具有以下结构:

./root/src/main/webapp/WEB-INF/flow
|-- subsection
|   |-- login
|   |   `-- subsection-login-flow.xml
|   `-- signup
|       `-- subsection-signup-flow.xml
|-- login
|   `-- login-flow.xml
`-- signup
    `-- signup-flow.xml


启用DEBUG日志记录后,我可以在日志中看到创建了四个流,它们的ID为“ login”,“ signup”,“ subsection / login”和“ subsection / signup”:

24-Apr 09:21:50,887 DEBUG RMI TCP Connection(2)-127.0.0.1 definition.registry.FlowDefinitionRegistryImpl -  Registering flow definition 'ServletContext resource [/WEB-INF/flow/subsection/login/subsection-login-flow.xml]' under id 'subsection/login'
24-Apr 09:21:50,887 DEBUG RMI TCP Connection(2)-127.0.0.1 definition.registry.FlowDefinitionRegistryImpl -  Registering flow definition 'ServletContext resource [/WEB-INF/flow/subsection/signup/subsection-signup-flow.xml]' under id 'subsection/signup'
24-Apr 09:21:50,888 DEBUG RMI TCP Connection(2)-127.0.0.1 definition.registry.FlowDefinitionRegistryImpl -  Registering flow definition 'ServletContext resource [/WEB-INF/flow/login/login-flow.xml]' under id 'login'
24-Apr 09:21:50,889 DEBUG RMI TCP Connection(2)-127.0.0.1 definition.registry.FlowDefinitionRegistryImpl -  Registering flow definition 'ServletContext resource [/WEB-INF/flow/signup/signup-flow.xml]' under id 'signup'


当我转到http://mysite.com/loginhttp://mysite.com/signup时,一切都会按预期进行。

但是,当我进入http://mysite.com/subsection/loginhttp://mysite.com/subsection/signup时,URI被映射到“登录”(而不是“子节/登录”)或“注册”(而不是“子节/注册”):

24-Apr 09:32:16,917 DEBUG ajp-bio-8009-exec-5 mvc.servlet.FlowHandlerMapping -  Mapping request with URI '/subsection/signup' to flow with id 'signup'


我在调试器中对此进行了追溯,并且DefaultFlowUrlHandler.getFlowId方法基于最后一个“ /”后面的内容返回流ID,因此对于URI“ / subsection / signup”而言,返回的流ID就是“ signup” 。

我在这里做错了什么?有什么方法可以强制执行所需的流映射?

谢谢!

最佳答案

我想通了。 DefaultFlowUrlHandler的文档指出:


  期望启动流的URL具有以下模式:

http://<host>/[app context path]/[app servlet path]/<flow path>



因此,对于URI“ / subsection / signup”,应用上下文路径为空(对于我们的webapp),应用servlet路径为“ subsection”,流路径为“ signup”。因此,这映射到“ signup” flowId,而不是“ subsection / signup”。

我通过子类化DefaultFlowUrlHandler并重写getFlowId方法来解决此问题:

public class UriFlowUrlHandler extends DefaultFlowUrlHandler
{
   @Override
   public String getFlowId(HttpServletRequest request)
   {
      // Strip off leading "/" and any file extension (e.g., ".jsp")
      String uriNoExtension = StringUtils.substringBeforeLast(request.getRequestURI().substring(1), ".");

      if (StringUtils.isNotEmpty(uriNoExtension))
         return uriNoExtension;
      else
         return super.getFlowId(request);
   }
}


然后,将这个bean注入我的webflow上下文中的FlowHandlerMapping中:

   <bean id="uriFlowUrlHandler" class="com.mycompany.web.spring.UriFlowUrlHandler" />

   <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
      <property name="flowRegistry" ref="flowRegistry" />
      <property name="alwaysUseFullPath" value="true" />
      <property name="flowUrlHandler" ref="uriFlowUrlHandler" />
   </bean>


也许有更好的方法,但这可行。

关于java - Spring Webflow URI映射到包含斜杠(“/”)的流ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16199365/

10-10 17:32