2011-06-17 14 views
6

Actualmente estoy creando un conjunto de enlaces con el código como este:¿Cómo puedo crear una Wicket URL que oculte sus parámetros?

BookmarkablePageLink<CheeseMain> havarti = 
    new BookmarkablePageLink<CheeseMain>("havarti", CheeseMain.class); 
havarti.setParameter("Title", "Havarti"); 
havarti.setParameter("Group", "cheeseName"); 
add(havarti); 

La dirección URL que sale tiene el formato https://mysite.com/;jsessionid=B85EE5CB0349CCA2FE37AF76AB5C30C1?wicket:bookmarkablePage=:com.mycompany.cheese.CheeseMain&Title=Havarti&group=cheeseName.

Mi problema es que ya no quiero que la URL de este enlace sea tildable. Idealmente, me gustaría que fuera algo simple como https://mysite.com/cheese, pero puedo vivir con una URL fea. Lo importante es que los parámetros no son visibles.

¿Cómo debo cambiar la forma en que estoy generando mis enlaces? He analizado las diferentes estrategias de codificación URL que proporciona Wicket, pero ninguna de ellas elimina los parámetros; solo los muestran de manera diferente.

+0

Omita el bit "Marcable", use un simple 'PageLink'. Si mal no recuerdo, debería funcionar. – biziclop

+0

@biziclop: He estado tratando de usar un 'Enlace' estándar -en realidad, una subclase de' Enlace', ya que 'Enlace' es abstracto- pero implica muchas otras modificaciones. 'PageLink' está en desuso, el Javadoc recomienda utilizar' BookmarkablePageLink' o 'Link' en su lugar. – Pops

+0

@Lord Torgamus Bueno, usa un 'Enlace' luego. :) O puede vivir con que está en desuso y usar 'PageLink'. Aunque no veo cómo usar un 'Enlace' puede ser mucho más complicado. ¿Puedes agregar más detalles sobre esto? Tal vez podamos encontrar una solución simple con 'Link's – biziclop

Respuesta

8

Los parámetros aparecen en la URL solo si la página es tildable, o si el enlace específico es marcable.

Si crea un Link que navega a la página utilizando setResponsePage(Page) (pasando una instancia de página) en lugar de setResponsePage(Class<Page>, PageParameters) (pasando una clase de página), el enlace creado no va a apuntar a la versión bookmarkable de la página, sino a un stateful ejemplo.

Para que esto funcione, no debe llamar al constructor super(PageParameters) (para que la página no tenga suficiente información para compilar la URL sin estado).

En este ejemplo, puede navegar al SecretPage a través de dos enlaces diferentes, uno sin estado, marcado como favorito y el otro con estado.

SecretPage también tiene dos constructores. Uno recibe un PageParameters y lo llama pasando el super. El otro recibe el valor directamente a través del parámetro construcor, y no lo pasa a super (si hubiera llamado al super(new PageParameters().add("message",message), como en la línea comentada, redirigiría automáticamente a una URL marcable).

HomePage.java:

public class HomePage extends WebPage { 
    public HomePage(final PageParameters parameters) { 
     add(new BookmarkablePageLink<Void>("bookmarkable", SecretPage.class, 
      new PageParameters().add("message", "This message will appear in the URL"))); 
     add(new Link<Void>("instance") { 
      @Override 
      public void onClick() { 
       setResponsePage(new SecretPage("This message will NOT appear in the URL")); 
      } 
     }); 
    } 
} 

homepage.html:

<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" > 
<body> 
    <p><a wicket:id="bookmarkable">Bookmarkable link (stateless)</a></p> 
    <p><a wicket:id="instance">Hidden parameters link (stateful)</a></p> 
</body> 
</html> 

SecretPage.java

public class SecretPage extends WebPage { 
    public SecretPage(PageParameters parameters) { 
     super(parameters); 
     init(parameters.get("message").toString("No message!")); 
    } 
    public SecretPage(String message) { 
     // super(new PageParameters().add("message", message)); // COMMENTED! 
     init(message); 
    } 
    private void init(String message) { 
     info(message); 
     add(new FeedbackPanel("feedback")); 
     add(new BookmarkablePageLink<Void>("back", getApplication().getHomePage())); 
    } 
} 

SecretPage.html

<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" > 
<body> 
    <p wicket:id="feedback"></p> 
    <p><a wicket:id="back">BACK</a></p> 
</body> 
</html> 

Y, para tener una URL simple, como http://host/app/secret, debe montarla. Puedes hacerlo en tu clase WebApplication.

WicketApplication.java

public class WicketApplication extends WebApplication { 
    @Override 
    protected void init() { 
     super.init(); 
     mountPage("home", getHomePage()); 
     mountPage("secret", SecretPage.class); 
    } 
    public Class<HomePage> getHomePage() { 
     return HomePage.class; 
    } 
} 

este ejemplo se utiliza Wicket 1.5 (todavía RC4.2), y necesitan algunas modificaciones para trabajar con 1.4.x (se cambió el nombre de algunos métodos y clases, o se mueven a diferentes paquetes), pero la idea es la mismo.

+0

De hecho estoy usando Wicket 1.4.1, así que tuve que convertir este código. No fue demasiado difícil, pero estaba desconcertado por la última línea del primer constructor 'SecretPage'. ¿Por qué da un argumento a 'toString()'? Eso ni siquiera compilará, para mí. – Pops

+0

La API cambió en 1.5. En 1.4, el equivalente sería algo como 'parameters.getString (" message "," No message! ")' – tetsuo

+0

Oh, wow, un parámetro intencional para 'toString()'. Ni siquiera lo consideré; Pensé que era un error tipográfico. Con esa solución, esto parece funcionar como se describe. Ahora, para descubrir cómo modificarlo para mi proyecto ... – Pops

0

aún se podía utilizar la URL de su estrategia de codificación de elección y encapsular sus parámetros en una clase heredada como:

public class Havarti extends CheeseMain { 
    public Havarti() { 
     super(new PageParameters("Title=Havarti,Group=cheeseName")); 
    } 
} 

continuación, puede utilizar: new BookmarkablePageLink<Void>("havarti", Havarti.class).

+0

Con esta estrategia, la URL aún estaría renunciando a la información. También implicaría la creación de cientos de clases nuevas para reemplazar una página que realmente solo debería tomar un parámetro y llamar al DB con él. (Mi código es solo un ejemplo; realmente no estoy creando una aplicación de queso.) – Pops

+0

@Lord Esa es la única forma de hacerlo sin * mostrar * los parámetros. La otra cosa que puede hacer es encriptar los parámetros al construir la URL y descifrarlos en su constructor (sin embargo, los valores encriptados seguirían mostrándose). Realmente no sé si estás haciendo una aplicación de queso xD, solo quería que mi código se relacionara con el tuyo. – Marcelo

Cuestiones relacionadas