Spring Web Flow и Url Rewrite Filter - очистка URL - PullRequest
3 голосов
/ 23 мая 2011

Я работаю над веб-приложением Spring MVC + Web Flow.Я сопоставил /home с контроллером MVC и /test с контроллером потока.Чтобы удалить /app из URL, я пытаюсь использовать Url Rewrite Filter.Сопоставления в контроллерах MVC (@Controller) хорошо работают с этим: http://localhost:8080/spring/home -> render home view.

Но когда запрос переходит в WebFlow Controller, что-то не так, что приводит к Error 404: http://localhost:8080/spring/test-> перенаправить на http://localhost:8080/spring/app/test?execution=e1s1 -> page not found.

Как удалить /app из URL-адресов и все заработало?

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-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'

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Временно я сделал это как здесь , используя настроенный 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), 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`
    }

}
0 голосов
/ 03 мая 2012

Вы пытаетесь удалить приложение из вашего URL, например, http://www.mydomain.com/app/home.html и измените его на http://www.mydomain.com/home.html

Если да, то вы должны настраивать server.xml, и ваше приложение должно быть развернуто как ROOT вместо app в public_html / или каталоге tomcat.

Это будет работать для вас

...