Wicket:如何重定向到另一个页面?

2022-09-02 00:15:25

如何使用 Wicket 重定向到另一个页面?IIRC,必须在构造函数中抛出一些异常,但我不记得是哪一个。提前致谢。


答案 1

正如您在自己的答案中指出的那样,抛出一个会这样做,但这实际上是允许重定向的系统的一部分,最终在当前页面继续(通常是授权过程的一部分)。如果这不是您的情况,但您仍然必须执行中断处理的事情,则最好抛出.RestartResponseAtInterceptPageExceptionRestartResponseException

据我所知,主要用途是在“重定向到登录页面”过程中。如果您使用的是基于角色的身份验证,则在确定您未登录时,的 实现将发出已配置的信号,通常,如果您未登录,则将引发此异常,并重定向到已配置的登录页面。(如果您已登录但未经授权,则会发生其他情况...)。RestartResponseAtInterceptPageExceptionIAuthorizationStrategyIUnauthorizedComponentInstantiationListenerAuthenticatedWebApplication

实际的重定向由 来完成,在这种情况下,它还会记住您尝试访问的页面。成功登录后,登录页面可以要求通过调用 将您发送到最初尝试的页面,这是 其中的一种方法,并从 中检索记住的页面。PageMapcontinueToOriginalDestination()ComponentPageMap

此身份验证过程有一些很好的示例代码,但异常和拦截在某种程度上隐藏在幕后。


答案 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);

使用HTTP 302重定向到URL(“暂时移动”):

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

使用HTTP 301重定向到URL(“永久移动”,SEO友好):

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