时间:2010-07-26 12:40:05

标签: java redirect wicket

5 个答案:

答案 0 :(得分:29)

如你在自己的回答中所提到的那样,抛出一个RestartResponseAtInterceptPageException将会这样做,但这实际上是允许在当前页面(通常是授权过程的一部分)进行重定向的系统的一部分。如果那不是你的情况,但你仍然需要做一些中断处理的事情,那么抛出RestartResponseException可能会更好。

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

实际重定向由PageMap完成,在这种情况下也会记住您尝试访问的页面。成功登录后,登录页面可以通过调用continueToOriginalDestination()Component中的方法,然后从PageMap检索记住的页面,要求您转到最初尝试的页面。 }。

这个身份验证过程有一些好example code,但异常和拦截在某种程度上隐藏在幕后。

答案 1 :(得分: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")); 

使用服务器重定向/转发重定向到wicket页面(浏览器的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(“永久移动”,SEO友好)重定向到URL:

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

答案 2 :(得分:5)

答案 3 :(得分:1)

我刚刚找到

getRequestCycle().setResponsePage(MyOtherPage.class);

至少在wicket 6中工作。它在服务器端工作并重写URL。也许它比使用异常要快一些。

答案 4 :(得分:0)

你可以使用

setResponsePage(new RedirectPage(" /"));

setResponsePage(HomePage.class);

抛出新的RestartResponseException(HomePage.class);