Подтвердить что ты не робот

Калитка: как перенаправить на другую страницу?

Как перенаправить на другую страницу с помощью Wicket? IIRC, какое-то исключение нужно добавить в конструктор, но я не помню, какой из них. Спасибо заранее.

4b9b3361

Ответ 1

Throwing RestartResponseAtInterceptPageException сделает это, как вы отметили в своем собственном ответе, но это действительно часть системы, позволяющая перенаправлять с возможным продолжением на текущей странице (часто являющейся частью процесса авторизации). Если это не ваша ситуация, но вы все равно должны сделать что-то, что прерывает обработку, было бы лучше выбросить RestartResponseException.

Основное использование, которое я знаю для RestartResponseAtInterceptPageException, находится в процессе переадресации на страницу входа в систему. Если вы используете проверку подлинности на основе ролей, реализация IAuthorizationStrategy при определении того, что вы не вошли в систему, будет сигнализировать настроенный IUnauthorizedComponentInstantiationListener, обычно AuthenticatedWebApplication, который выдает это исключение, если вы не вошли в систему, с перенаправлением на настроенную страницу входа в систему. (Если вы вошли в систему, но не авторизованы, произойдет что-то еще...).

Фактическое перенаправление выполняется с помощью PageMap, который также в этом случае запоминает страницу, к которой вы пытались перейти. После успешного входа в систему, страница входа в систему может попросить отправить вас на страницу, которую вы пытались первоначально, вызывая continueToOriginalDestination(), который является методом в Component, и извлекает сохраненную страницу из PageMap.

Там какой-то хороший пример кода для этого процесса аутентификации, но исключение и перехват несколько скрываются за кулисами.

Ответ 2

Перенаправление на страницу калитки с использованием перенаправления клиента (HTTP 302, URL-адрес браузера изменяется):

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
...
throw new RestartResponseException(
    TargetWicketPage.class, 
    new PageParameters().set("param1", "value1")); 

Перенаправить на страницу калитки, используя перенаправление/переадресацию сервера (URL-адрес браузера не изменяется):

Так как Wicket 1.5RC5.1:

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.request.handler.PageProvider;
import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy;
import org.apache.wicket.request.mapper.parameter.PageParameters;
...
throw new RestartResponseException(
    new PageProvider(
        TargetWicketPage.class, 
        new PageParameters().set("param1", "value1")), 
    RedirectPolicy.NEVER_REDIRECT));

До Wicket 1.5RC5.1:

import org.apache.wicket.request.RequestHandlerStack.ReplaceHandlerException;
import org.apache.wicket.request.handler.PageProvider;
import org.apache.wicket.request.handler.RenderPageRequestHandler;
import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy;
import org.apache.wicket.request.mapper.parameter.PageParameters;
...
throw new ReplaceHandlerException(
    new RenderPageRequestHandler(
        new PageProvider(
            TargetWicketPage.class, 
            new PageParameters().set("param1", "value1")), 
        RedirectPolicy.NEVER_REDIRECT), 
    true);

Перенаправить на URL-адрес, используя HTTP 302 ( "Moved Temporarily" ):

import org.apache.wicket.request.flow.RedirectToUrlException;
...
throw new RedirectToUrlException("http://targetURL");

Перенаправить на URL-адрес, используя HTTP 301 ( "Перемещаемый постоянно", ориентированный на SEO):

import org.apache.wicket.request.flow.RedirectToUrlException;
import javax.servlet.http.HttpServletResponse;
...
throw new RedirectToUrlException("http://targetURL", 
    HttpServletResponse.SC_MOVED_PERMANENTLY);

Ответ 3

Быстрый поиск всех файлов *Exception.java в калитке показал это. Нужно выбросить RestartResponseAtInterceptPageException:

public MyPage() {
   ...
   if (redirect) {
       throw new RestartResponseAtInterceptPageException(targetPage);
   }
   ...
}

Ответ 4

Я только что нашел

getRequestCycle().setResponsePage(MyOtherPage.class);

который работает, по крайней мере, в калитки 6. Он работает на стороне сервера и переписывает URL-адрес. Возможно, это немного быстрее, чем использование исключения.