Перезапись URL с помощью OcpSoft переписать правило Join.path

Я использую Ocpsoft Rewrite, чтобы выполнить перезапись URL в проекте JSF. У меня есть правило перенаправления, которое отлично работает:

.addRule()
        .when(Direction.isInbound().and(Path.matches("/venue/{id}")))
        .perform(Redirect.temporary(context.getContextPath() + 
                "/protected/index.xhtml?venueID={id}"));

Однако из-за перенаправления это приводит к изменению URL-адреса на панели навигации. Я думал, что вместо этого мог бы использовать правило Join, но оно не работает так, как я ожидал:

.addRule(Join.path("/venue/{venueID}").to("/protected/index.xhtml"))
        .perform(Log.message(Level.INFO, "Rewrite is active!"));

Я думал, что это правило будет перенаправлять, например, с foo/venue/123 в foo/protected/index.xhtml?venueID=123но я не понимаю ?venueID=... параметр добавляется к URL.

Кто-нибудь знает, как должно выглядеть правильное правило?

2 ответа

Решение

Ваше правило выглядит правильно. Но объединение не приводит к перенаправлению. Вместо этого он перенаправляет запрос внутренне. Это означает, что URL не изменился. Таким образом, вы не будете "видеть" параметр venueID в URL. Но вы сможете прочитать параметр, используя стандартный API сервлетов:

String id = HttpServletRequest.getParameter("venueID");

Если вы действительно хотите, вы можете сделать Forward вместо:

.addRule()
.when(Direction.isInbound().and(Path.matches("/venue/{id}")))
.perform(Forward.to("/protected/index.xhtml?venueID={id}"));

Но это не будет обрабатывать исходящие ссылки HTML, как Join!

Другие вопросы по тегам