微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Web Flow和Url重写过滤器-清理URL

如何解决Spring Web Flow和Url重写过滤器-清理URL

|| 我正在研究Spring MVC + Web Flow Web应用程序。我已经将“ 0”映射到MVC Controller,将“ 1”映射到Flow Controller。要从网址中删除“ 2”,我正在尝试使用“ 3”。 MVC控制器(@Controller)中的映射可以很好地实现:
http://localhost:8080/spring/home
->渲染
home
视图。 但是,当请求发送到WebFlow Controller时,出现错误,导致出现“ 6”:
http://localhost:8080/spring/test
->重定向
http://localhost:8080/spring/app/test?execution=e1s1
->
page not found
。 如何从URL中删除
/app
并使一切正常工作? urlrewrite.xml:
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<!DOCTYPE urlrewrite PUBLIC \"-//tuckey.org//DTD UrlRewrite 3.0//EN\" \"urlrewrite3.0.dtd\">
<urlrewrite default-match-type=\"wildcard\">
    <!-- to remove /app -->
    <rule>
        <from>/**</from>
        <to>/app/$1</to>
    </rule>
    <outbound-rule>
        <from>/app/**</from>
        <to>/$1</to>
    </outbound-rule>
</urlrewrite>
分派器servlet映射:
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/app/*</url-pattern>
</servlet-mapping>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
简单控制器:
@Controller
public class MainController {

    @RequestMapping(value={\"/home\",\"/\"})
    public String index(Model model) {
        return \"index\";
    }

}
一些日志:
DEBUG [FlowHandlerMapping:108] : Mapping request with URI \'/spring/app/test\' to flow with id \'test\'
DEBUG [FlowExecutorImpl:135] : Launching new execution of flow \'test\' with input null
DEBUG [FlowDeFinitionRegistryImpl:59] : Getting FlowDeFinition with id \'test\'
DEBUG [FlowExecutionImplFactory:78] : Creating new execution of \'test\'
...
DEBUG [FlowExecutionImpl:417] : Assigned key e2s1
DEBUG [FlowHandlerAdapter:367] : Sending flow execution redirect to \'/spring/app/test?execution=e2s1\'
DEBUG [dispatcherServlet:824] : Null ModelAndView returned to dispatcherServlet with name \'spring\': assuming HandlerAdapter completed request handling
DEBUG [dispatcherServlet:674] : Successfully completed request
DEBUG [dispatcherServlet:693] : dispatcherServlet with name \'spring\' processing GET request for [/spring/app/app/test]
DEBUG [FlowHandlerMapping:114] : No flow mapping found for request with URI \'/spring/app/app/test\'
WARN  [PageNotFound:947] : No mapping found for HTTP request with URI [/spring/app/app/test] in dispatcherServlet with name \'spring\'
    

解决方法

我暂时使用定制的FlowHandler做到了。它有效,但是我认为它必须是一个更简单的解决方案...
package utils;
public class PrettyFlowUrlHandler extends DefaultFlowUrlHandler {

    @Override
    public String createFlowDefinitionUrl(String flowId,AttributeMap input,HttpServletRequest request) {
       return cleanUrl(super.createFlowDefinitionUrl(flowId,input,request),request);
    }

    @Override
    public String createFlowExecutionUrl(String flowId,String flowExecutionKey,HttpServletRequest request) {
       return cleanUrl(super.createFlowExecutionUrl(flowId,flowExecutionKey,request);
    }

    protected String cleanUrl(String url,HttpServletRequest request) {
       String pattern = request.getServletPath().substring(1) + \"/\";
       return url.replaceFirst(pattern,\"\");
    }
}
配置:
<bean id=\"flowMappings\" class=\"org.springframework.webflow.mvc.servlet.FlowHandlerMapping\">
    <property name=\"flowRegistry\" ref=\"flowRegistry\"/>
    <property name=\"flowUrlHandler\">
        <bean class=\"utils.PrettyFlowUrlHandler\"/>
    </property>
    <property name=\"order\" value=\"0\" />
</bean>

<bean class=\"org.springframework.webflow.mvc.servlet.FlowHandlerAdapter\">
    <property name=\"flowExecutor\" ref=\"flowExecutor\"/>
    <property name=\"flowUrlHandler\">
        <bean class=\"utils.PrettyFlowUrlHandler\"/>
    </property>
</bean>
编辑 无法使用自定义流处理程序,如下所示:
@Component(\"test\")
public class DataHandler extends AbstractFlowHandler {

    @Override
    public String handleExecutionOutcome(FlowExecutionOutcome outcome,HttpServletRequest request,HttpServletResponse response) {
        // ... checking outcome ...
        return \"/home\"; // redirect to \'404 page not found\',because of rewrite to `/app/app/home`
    }

}
    ,您是否要从网址中删除应用,例如 http://www.mydomain.com/app/home.html并将其更改为 http://www.mydomain.com/home.html 如果是,则应配置server.xml,并且应将应用程序部署为ROOT而不是public_html /或tomcat目录中的app。 这对你有用     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。