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

sti*_*vlo 18 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Bor*_*hov 30

我认为只有在处理请求时才能获得绝对 URL,因为您的服务器可能有许多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);
    }
Run Code Online (Sandbox Code Playgroud)

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

类似的问题

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


bim*_*api 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...
}
Run Code Online (Sandbox Code Playgroud)

这假设您已org.springframework.web.context.request.RequestContextListener注册为听众web.xml