2011-01-02 11 views
18

Digamos que tengo una aplicación que tiene que acortar las URL, pero también hacer otras cosas. (como google.com y goo.gl, o facebook.com y fb.me).Múltiples dominios con mvc de resorte

Será fácil implementar simplemente dos aplicaciones, pero (por ahora) es más fácil ser solo una. Usando primavera y primavera-mvc. Tengo las siguientes asignaciones:

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

Por desgracia, el headers anotación no actúa como dar información más específica, sino como una restricción en su lugar. Entonces, si tengo estos dos, solo se invoca el último, incluso si lo abro como http://foo.br/asdf. Si sale solo del primero, funciona para los que provienen del foo.br y no abre nada si el host es diferente.

Por lo tanto, las preguntas:

  • ¿Cómo puedo hacer dos manejadores para los mismos caminos, pero diferentes direcciones URL/hosts
  • es posible resolver el host de forma dinámica, con un configurador marcador de posición propiedad (en vez que lo codifica en la anotación)

Tal vez ambos funcionen si hay algún mecanismo enchufable para la resolución del método. ¿Hay tal?

+0

[Gestión de varios Dominio y Sub Dominio] (http://technology.sravi.com/2011/05/managing-multiple-domain-and -sub-domain.html) – Lucky

Respuesta

15

Mi sugerencia inmediata sería escribir un filtro de servlet (o un Spring HandlerInterceptor), que tomaría el nombre de host de la solicitud, lo antepondría a la ruta solicitada original y luego reenviaría la solicitud.

Por ejemplo, dado el URL solicitado http://goo.gl/my/path, el filtro reenviará a /goo.gl/my/path. Las asignaciones de Spring MVC tendrían algo en qué meterse los dientes. La sintaxis de estilo hormiga comodín (por ejemplo "**/my/path") o estilo trayectoria variable (por ejemplo "{requestHost}/my/path" podrían ser útiles allí.

Alternativamente, el filtro podría establecer un atributo de encabezado personalizado o solicitud que contiene el host solicitado, pero eso es probablemente menos flexible.

no estoy seguro de lo que entendemos por la segunda parte de su pregunta, aunque

he aquí un fragmento de trabajo:.

@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

muy buena idea :) la 2da pregunta fue sobre configurar el nombre de host corto en lugar de hardcoding. Pero tu sugerencia corrige eso también (Inyectaré un '@ Value' en el interceptor). Lo intentaré y luego aceptaré la respuesta – Bozho

+1

funciona :) agregó un fragmento de código. (Podría usar getHeader ("Host"), pero no hace la diferencia) – Bozho

2

sobre la base de su descripción, que s ounds como usted podría tener dos métodos de controlador con cada asignación de cabecera de dominio:

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

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

Pensé en eso, sí, y probablemente funcionaría (por lo tanto, +1), pero esto significaría la codificación de mis hosts, que no es tan bueno :) – Bozho

+1

spring mvc marcadores de posición de soporte en la anotación de mapeo de solicitud, esto también puede funcionar en la propiedad de encabezados – msangel

Cuestiones relacionadas