如何使用Wicket重定向到另一个页面?如果我没记错,必须在构造函数中抛出某些异常,但我不记得是哪个异常。提前致谢。
抛出RestartResponseAtInterceptPageException
即可实现,就像您在自己的答案中提到的那样,但这实际上是一个允许在当前页面进行重定向并最终继续处理的系统的一部分(通常是授权过程的一部分)。如果这不是您的情况,但仍然需要执行中断处理,最好抛出RestartResponseException
。
我知道RestartResponseAtInterceptPageException
主要用于“重定向到登录页面”过程。如果您正在使用基于角色的身份验证,则IAuthorizationStrategy
的实现会在确定您未登录时发出已配置的IUnauthorizedComponentInstantiationListener
信号,通常为AuthenticatedWebApplication
。如果您未登录,则会抛出此异常,并重定向到已配置的登录页面。(如果您已登录但未获得授权,则会发生其他情况...)
实际重定向由PageMap
完成,在此情况下,PageMap
还会记住您尝试进入的页面。成功登录后,登录页面可以通过调用continueToOriginalDestination()
来请求将您重定向回最初尝试的页面,该方法位于Component
中,并从PageMap
检索已记住的页面。
有一些很好的示例代码用于此身份验证过程,但异常和截取在幕后进行。
使用客户端重定向(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);
*Exception.java
文件后,发现需要抛出一个RestartResponseAtInterceptPageException
:public MyPage() {
...
if (redirect) {
throw new RestartResponseAtInterceptPageException(targetPage);
}
...
}
setResponsePage(new RedirectPage("/"));
或
setResponsePage(HomePage.class);
或
throw new RestartResponseException(HomePage.class);
这些代码都可以将用户重定向到主页。getRequestCycle().setResponsePage(MyOtherPage.class);