2011-07-25 19 views
15

Me gustaría encontrar la URL absoluta de la aplicación web en Spring, desde el Controlador. Conozco JSTL c: url, pero necesito esta información desde el interior del controlador.¿Cómo encontrar la URL base de la aplicación web actual en Spring?

@Controller 
public class AuthorizeController { 

    @Autowired 
    private Authorizer auth; 

    @RequestMapping("/auth") 
    public String sendToAuthorization() {   
     String baseUrl = "http://localhost:8080/tasks/"; 
     return "redirect:" + auth.getAuthorizationUrl(baseUrl); 
    } 

} 

Como se puede ver el baseUrl es codificado, y yo podría proporcionar a la clase Authorizer a través de la configuración de la primavera, pero estoy seguro de que es posible obtener esta información de la primavera en el controlador. Intenté googlear "spring mvc url" y no pude encontrar una manera de resolver este problema.

Respuesta

22

Creo que obtener absolute url solo es posible mientras procesa la solicitud ya que su servidor puede tener muchas direcciones IP y nombres de dominio.

@RequestMapping("/auth") 
    public String sendToAuthorization(HttpServletRequest request) {   
    String baseUrl = String.format("%s://%s:%d/tasks/",request.getScheme(), request.getServerName(), request.getServerPort()); 


     return "redirect:" + auth.getAuthorizationUrl(baseUrl); 
    } 

En cuanto al servlet, también puede tener varias asignaciones en web.xml.

similar question

P. S. De todos modos, el análisis de url en tiempo de ejecución no me parece una buena idea.

+1

entiendo y que podría tener mod_jk, reescritura de URL y el servlet no sería consciente de ello. También leyendo la otra pregunta que ha vinculado, creo que mi mejor opción es inyectar esta URL base en el bean con la configuración XML de primavera. Gracias. – stivlo

8

Muy tarde para esta respuesta, pero una variante de la respuesta de Boris, si no desea insertar objetos servlet en las firmas de métodos, es usar RequestContextHolder de una clase/método de utilidad. Esto también daría la capacidad de abstraer la lógica de repliegue (por ejemplo, extraer de un archivo de propiedades). cursi ejemplo:

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); 
if(null != requestAttributes && requestAttributes instanceof ServletRequestAttributes) { 
    HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest(); 
    // build URL from request 
} 
else { 
    // fallback logic if request won't work... 
} 

Esto supone que haya org.springframework.web.context.request.RequestContextListener registrada como oyente en web.xml

Cuestiones relacionadas