Какой лучший способ получить текущий URL-адрес в Spring MVC?
Я хотел бы создать URL-адреса на основе URL-адреса, используемого клиентом для активного запроса. Есть ли что-нибудь умнее, чем взять текущий объект HttpServletRequest
, а методы getParameter...()
- перестроить полный URL, включая (и только) его параметры GET.
Уточнение: если возможно, я хочу отказаться от использования объекта HttpServletRequest
.
Ответы
Ответ 1
Ну, есть два способа облегчения доступа к этим данным, но интерфейс не дает возможности получить весь URL с одним вызовом. Вы должны создать его вручную:
public static String makeUrl(HttpServletRequest request)
{
return request.getRequestURL().toString() + "?" + request.getQueryString();
}
Я не знаю, как это сделать с любыми средствами Spring MVC.
Если вы хотите получить доступ к текущему запросу, не передавая его повсюду, вам нужно будет добавить слушателя в web.xml:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
И затем используйте это, чтобы получить запрос, привязанный к текущему потоку:
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
Ответ 2
Вместо прямого использования RequestContextHolder
вы также можете использовать ServletUriComponentsBuilder
и его статические методы:
-
ServletUriComponentsBuilder.fromCurrentContextPath()
-
ServletUriComponentsBuilder.fromCurrentServletMapping()
-
ServletUriComponentsBuilder.fromCurrentRequestUri()
-
ServletUriComponentsBuilder.fromCurrentRequest()
Они используют RequestContextHolder
под капотом, но предоставляют дополнительную гибкость для создания новых URL-адресов, используя возможности UriComponentsBuilder
.
Пример:
ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();
Ответ 3
Java URI Class может помочь вам в этом:
public static String getCurrentUrl(HttpServletRequest request){
URL url = new URL(request.getRequestURL().toString());
String host = url.getHost();
String userInfo = url.getUserInfo();
String scheme = url.getProtocol();
String port = url.getPort();
String path = request.getAttribute("javax.servlet.forward.request_uri");
String query = request.getAttribute("javax.servlet.forward.query_string");
URI uri = new URI(scheme,userInfo,host,port,path,query,null)
return uri.toString();
}
Ответ 4
в файле jsp:
request.getAttribute("javax.servlet.forward.request_uri")