Перезапись URL с помощью OcpSoft rewrite Правило 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-адрес на панели навигации. Я думал, что вместо этого могу использовать правило соединения, но оно не работает так, как я ожидал:

.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-адресу.

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


person user473453    schedule 10.05.2014    source источник


Ответы (2)


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

String id = HttpServletRequest.getParameter("venueID");
person chkal    schedule 11.05.2014
comment
У меня такая же проблема в приложении GWT, но я не могу получить параметр на стороне GWT с помощью: Window.Location.getParameter(param); - person Daniel Hári; 21.06.2016

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

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

Но это не справится с исправлением исходящей HTML-ссылки, как это сделает Join!

person Lincoln    schedule 14.05.2014
comment
Хорошо, но если есть другие параметры, они будут переданы или нет? - person Daniel Hári; 21.06.2016
comment
Нет, он будет пересылать только те параметры, которые вы указали в шаблоне. - person Lincoln; 22.06.2016
comment
Однако, как уже упоминал Кристиан. Все параметры, в том числе исходные из исходного URL, будут доступны через стандартный API сервлетов: - person Lincoln; 22.06.2016
comment
Идентификатор строки = HttpServletRequest.getParameter (venueID); - person Lincoln; 22.06.2016
comment
Как достичь этих параметров на стороне GWT? Window.Location.getParameter(param) не работает. - person Daniel Hári; 22.06.2016
comment
Вам нужно будет предоставить параметры через веб-сервис. Параметры на стороне сервера недоступны на стороне клиента, если вы не предоставите их напрямую. - person Lincoln; 22.06.2016
comment
Вы также можете проанализировать значения из URL-адреса непосредственно на стороне клиента, если они вам нужны. - person Lincoln; 05.07.2016
comment
Но в этом случае при изменении я должен также вручную переписать на стороне клиента, пропуская библиотеку ocl? Чтобы быть конкретным, я хочу украсить это приложение log4jtester.com, чтобы заменить, например, ?p= на /pattern/. (Он мгновенно переписывает URL-адрес при изменении шаблона) - person Daniel Hári; 05.07.2016
comment
Нисколько. Вам просто нужно проанализировать новый URL-адрес любого URL-адреса страницы и получить необходимую информацию на стороне клиента: window.getLocation() и т. д. Это полностью независимо от серверной стороны. - person Lincoln; 05.07.2016