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

22

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

5个回答

29

抛出RestartResponseAtInterceptPageException即可实现,就像您在自己的答案中提到的那样,但这实际上是一个允许在当前页面进行重定向并最终继续处理的系统的一部分(通常是授权过程的一部分)。如果这不是您的情况,但仍然需要执行中断处理,最好抛出RestartResponseException

我知道RestartResponseAtInterceptPageException主要用于“重定向到登录页面”过程。如果您正在使用基于角色的身份验证,则IAuthorizationStrategy的实现会在确定您未登录时发出已配置的IUnauthorizedComponentInstantiationListener信号,通常为AuthenticatedWebApplication。如果您未登录,则会抛出此异常,并重定向到已配置的登录页面。(如果您已登录但未获得授权,则会发生其他情况...)

实际重定向由PageMap完成,在此情况下,PageMap还会记住您尝试进入的页面。成功登录后,登录页面可以通过调用continueToOriginalDestination()来请求将您重定向回最初尝试的页面,该方法位于Component中,并从PageMap检索已记住的页面。

有一些很好的示例代码用于此身份验证过程,但异常和截取在幕后进行。


抱歉,我不理解您所说的“当前页面的最终连续性”。您能否详细说明一下?先谢谢了。 - Mot
@mklhmnn:我已经添加了一些关于常见用法和其运作方式的注释。它有点复杂,所以我不确定这对你有多大帮助。 - Don Roby
感谢您的出色回答。只需调用continueToOriginalDestination()就基本解决了我的问题。 - Jonik

23

使用客户端重定向(HTTP 302,浏览器的URL更改)重定向到一个wicket页面:

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页面:

自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);

5
在wicket中搜索所有*Exception.java文件后,发现需要抛出一个RestartResponseAtInterceptPageException:
public MyPage() {
   ...
   if (redirect) {
       throw new RestartResponseAtInterceptPageException(targetPage);
   }
   ...
}

3
您可以使用以下代码之一来重定向页面:

setResponsePage(new RedirectPage("/"));

setResponsePage(HomePage.class);

throw new RestartResponseException(HomePage.class);

这些代码都可以将用户重定向到主页。

1
我刚刚发现
getRequestCycle().setResponsePage(MyOtherPage.class);

这段代码至少在wicket 6中可用。它在服务器端工作并重写URL。也许比使用异常更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接