我们要求在我们网站的一个小节中对登录和注册的处理略有不同。对于以下每个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/login或http://mysite.com/signup时,一切都会按预期进行。
但是,当我进入http://mysite.com/subsection/login或http://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/