如何在春季找到当前Web应用程序的基本URL?

2022-09-02 00:43:59

我想从控制器中找到春季Web应用程序的绝对URL。我知道JSTL c:url,但我需要从控制器内部获得此信息。

@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配置将其提供给授权者类,但我确信可以从控制器中的Spring获取此信息。我试图谷歌“spring mvc url”,但找不到解决这个问题的方法。


答案 1

我认为只有在处理请求时才有可能获得绝对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);
    }

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

类似问题

附言:无论如何,运行时中的url解析对我来说不是一个好主意。


答案 2

这个答案很晚了,但是鲍里斯答案的变体,如果你不想将servlet对象推入方法签名中,那就是从实用程序类/方法中使用。这也将提供抽象回退逻辑的能力(例如,从属性文件中提取)。俗气的例子: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.RequestContextListenerweb.xml


推荐