Java 如何在Spring中找到当前webapp的基本URL?
我想从控制器中找到春季webapp的绝对URL。我知道jstlc: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 =
@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。谢谢