Каков наилучший способ получить текущий URL-адрес в Spring MVC?
Я хотел бы создать URL-адреса на основе URL-адреса, используемого клиентом для активного запроса. Есть ли что-нибудь умнее, чем нынешние
6 ответов:
Ну есть два способа получить доступ к этим данным проще, но интерфейс не предлагает возможность получить весь URL с одним вызовом. Вы должны построить его вручную:
public static String makeUrl(HttpServletRequest request) { return request.getRequestURL().toString() + "?" + request.getQueryString(); }
Я не знаю, как это сделать с любыми средствами Spring MVC.
Если вы хотите получить доступ к текущему запросу, не передавая его везде, вам придется добавить слушателя в интернете.XML-код:
<listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>
а затем использовать это, чтобы получить запрос привязан к текущему Тема:
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
вместо
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();
класс URI Java может помочь вам в этом:
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(); }
вы также можете добавить
UriComponentsBuilder
к сигнатуре метода вашего метода контроллера. Spring введет экземпляр построителя, созданный из текущего запроса.@GetMapping public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) { URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder .replacePath(null) .replaceQuery(null) .pathSegment("some", "new", "path") .build().toUri(); //... }
С помощью конструктора вы можете непосредственно начать создавать URI на основе текущего запроса, например, изменить сегменты пути.
Если вам нужен URL-адрес до имени хоста, а не путь, используйте общую Lib Apache
StringUtil
, а из URL извлеките подстроку до третьего indexOf/
.public static String getURL(HttpServletRequest request){ String fullURL = request.getRequestURL().toString(); return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3)); }
пример: если fullURL и
https://example.com/path/after/url/
затем выход будетhttps://example.com