2010-07-26 34 views

Respuesta

28

Lanzar un RestartResponseAtInterceptPageException lo hará, como se anotó en su propia respuesta, pero eso es realmente parte de un sistema que permite una redirección con una prolongación eventual en la página actual (con frecuencia parte de un proceso de autorización). Si esa no es su situación, pero aún tiene que hacer algo que interrumpa el procesamiento, podría ser mejor lanzar un RestartResponseException.

El uso del principal que conozco para RestartResponseAtInterceptPageException se encuentra en el proceso de "redirigir a la página de inicio de sesión". Si está utilizando la autenticación basada en roles, una implementación de IAuthorizationStrategy al determinar que no ha iniciado sesión indicará un IUnauthorizedComponentInstantiationListener configurado, generalmente el AuthenticatedWebApplication que arroja esta excepción si no ha iniciado sesión, con un redireccionamiento a una configuración página de inicio de sesión. (Si ha iniciado sesión pero no está autorizado, sucede algo más ...).

El redireccionamiento real lo realiza el PageMap, que también en este caso recuerda la página a la que intentaba acceder. Después de un inicio de sesión exitoso, la página de inicio de sesión puede solicitarle que lo envíe a la página que estaba tratando originalmente llamando al continueToOriginalDestination(), que es un método en Component y recupera la página recordada del PageMap.

Hay algunos buenos example code para este proceso de autenticación, pero la excepción y el interceptar se esconden detrás de las escenas de alguna manera.

+0

Lo siento, no entiendo lo que quiere decir con "eventual continuación en la página actual". ¿Podrías por favor elaborar un poco? Gracias por adelantado. – Mot

+0

@mklhmnn: He agregado algunas notas sobre un uso común y un poco sobre cómo funciona.Es intrincado, así que no estoy seguro de cuánto ayuda esto. –

+0

Gracias por la explicación detallada. – Mot

5

Una búsqueda rápida para todos *Exception.java archivos en wicket lo reveló. Uno tiene que lanzar una RestartResponseAtInterceptPageException:

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

redirección a una página portillo, utilizando un cliente de redireccionamiento (HTTP 302, los cambios de tu navegador URL):

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

redirigir a una página portillo, utilizando una redirección de servidor/delante (URL del navegador se mantiene sin cambios):

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

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

redirección a una dirección URL, a través de HTTP 302 ("Movido temporalmente"):

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

redirección a una dirección URL, a través de HTTP 301 ("Movido permanentemente", SEO):

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

me acaba de encontrar

getRequestCycle().setResponsePage(MyOtherPage.class); 

que está trabajando por lo menos en portillo 6. se trabaja del lado del servidor y vuelve a escribir la URL también. Tal vez es un poco más rápido que usar una excepción.

Cuestiones relacionadas