Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring中找到当前webapp的基本URL?_Java_Servlets_Spring Mvc - Fatal编程技术网

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

Java 如何在Spring中找到当前webapp的基本URL?,java,servlets,spring-mvc,Java,Servlets,Spring Mvc,我想从控制器中找到春季webapp的绝对URL。我知道jstlc:url,但我需要从控制器内部获得这些信息 @Controller public class AuthorizeController { @Autowired private Authorizer auth; @RequestMapping("/auth") public String sendToAuthorization() { String baseUrl =

我想从控制器中找到春季webapp的绝对URL。我知道jstlc: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配置将其提供给Authorizer类,但我确信可以从控制器中的Spring获取此信息。我尝试用谷歌搜索“spring mvc url”,但找不到解决此问题的方法。

我认为只有在处理请求时才能获得绝对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解析对我来说不是一个好主意。

这个答案已经很晚了,但是Boris的答案的一个变体,如果您不想将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...
}

这假定您已经在
web.xml

中注册了
org.springframework.web.context.request.RequestContextListener
作为侦听器,据我所知,它可能已经修改了mod_jk、url重写,而servlet不会意识到这一点。同时阅读您链接的另一个问题,我认为我的最佳选择是使用SpringXML配置在bean中注入这个基本URL。谢谢