2011-01-02 22 views
18

Diciamo che ho un'applicazione che deve accorciare gli URL, ma anche altre cose. (come google.com e goo.gl o facebook.com e fb.me).Domini multipli con mvc a molla

Sarà facile implementare semplicemente due applicazioni, ma (per ora) è più semplice essere una sola. Usando molla e molla-mvc. Ho le seguenti mappature:

@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br") 
... 
@RequestMapping(value="/{username}") 

Alas, l'annotazione headers non agisce come dare informazioni più specifiche, ma come una limitazione, invece. Quindi, se ho questi due, viene invocato solo il secondo, anche se lo apro come http://foo.br/asdf. Se si lascia solo il primo, funziona per quelli che provengono da foo.br e non apre nulla se l'host è diverso.

Quindi, le domande:

  • Come posso fare due gestori per gli stessi percorsi, ma diversi URL/Host
  • è possibile per risolvere l'host in modo dinamico, con un configuratore di proprietà segnaposto (piuttosto di hard-code nell'annotazione)

Forse entrambi funzionerebbero se ci fosse un meccanismo collegabile per la risoluzione del metodo. Esiste?

+0

[la gestione di più di dominio e sottodominio] (http://technology.sravi.com/2011/05/managing-multiple-domain-and -sub-domain.html) – Lucky

risposta

15

Il mio suggerimento immediato sarebbe quello di scrivere un filtro servlet (o una molla HandlerInterceptor), che prenderebbe il nome host dalla richiesta, anteporlo al percorso richiesto originale, quindi inoltrare sulla richiesta.

Ad esempio, dato l'URL richiesto http://goo.gl/my/path, il filtro inoltrerebbe a /goo.gl/my/path. Le mappature MVC primaverili avrebbero quindi qualcosa in cui inserire i denti. La sintassi formica stile jolly (ad es "**/my/path") o lo stile percorso variabile (ad esempio "{requestHost}/my/path" potrebbe essere utile là.

In alternativa, il filtro potrebbe impostare un attributo di intestazione personalizzata o richiesta contenente l'host richiesto, ma questo è probabilmente meno flessibile.

io non sono sicuro di cosa si intende per la seconda parte della tua domanda, anche se

Ecco un frammento di lavoro:.

@Override 
public boolean preHandle(HttpServletRequest request, 
     HttpServletResponse response, Object handler) throws Exception { 

    if (request.getRequestURL().toString().contains(shortenerDomain) 
      && !request.getRequestURI().startsWith(SHORT_URI_PREFIX)) { 

     request.getRequestDispatcher(SHORT_URI_PREFIX + request.getRequestURI()) 
       .forward(request, response); 
     return false; 
    } else { 
     return true; 
    } 
} 
+0

ottima idea :) la seconda domanda riguardava la configurazione del nome host breve piuttosto che l'hardcoding. Ma il tuo suggerimento risolve anche questo (inserirò un '@ Valore' nell'intercettore). Proverò e provare la risposta – Bozho

+1

works :) aggiunto un frammento di codice. (Potrebbe usare getHeader ("Host"), ma non fa differenza) – Bozho

2

sulla base della sua descrizione, si s ounds come si potrebbe avere due metodi di controller con ogni mapping di intestazione del dominio:

@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br") 
public void fooBr() { ... } 

@RequestMapping(value="/{shortUrlKey}", headers="Host=bar.bz") 
public void barBz() { ... } 
+0

Ci ho pensato, sì, e probabilmente avrebbe funzionato (quindi +1), ma questo significherebbe che i miei host, che non sono codificati quello buono :) – Bozho

+1

mario di primavera supporto segnaposto nella richiesta di annotazione di mapping, questo può funzionare anche sulla proprietà delle intestazioni – msangel

Problemi correlati