我想从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”并找不到解决这个问题的方法。
答案 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中也可能有几个映射。
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
注册为听众