如何在Spring中找到当前webapp的基本URL?

时间:2011-07-25 10:16:29

标签: java servlets spring-mvc

我想从Controller中找到Spring中webapp的绝对URL。我知道JSTL c:url,但我需要来自Controller内部的这些信息。

@Controller
public class AuthorizeController {

    @Autowired
    private Authorizer auth;

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

}

正如您所看到的,baseUrl是硬编码的,我可以通过Spring配置将它提供给Authorizer类,但我确信可以在Controller中从Spring获取此信息。我试图google“spring mvc url”并找不到解决这个问题的方法。

2 个答案:

答案 0 :(得分:28)

我认为只有在处理请求时才能获得绝对网址,因为您的服务器可能有许多IP地址和域名。

 @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);
    }

对于servlet,它在web.xml中也可能有几个映射。

similar question

P.S。无论如何,在运行时解析url对我来说并不是一个好主意。

答案 1 :(得分:10)

这个答案很晚,但如果你不想将servlet对象推送到方法签名中,那么Boris的答案的变体就是使用实用程序类/方法中的RequestContextHolder。这也将提供抽象回退逻辑的能力(例如,从属性文件中提取)。俗气的例子:

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...
}

这假设您已在org.springframework.web.context.request.RequestContextListener

web.xml注册为听众