스프링 MVC에서 현재 URL을 얻는 가장 좋은 방법은 무엇입니까?
-
18-09-2019 - |
문제
활성 요청에 클라이언트가 사용하는 URL을 기반으로 URL을 작성하고 싶습니다. 현재를 취하는 것보다 더 똑똑한 것이 있습니까? HttpServletRequest
대상입니다 getParameter...()
매개 변수를 포함하여 전체 URL을 재구성하는 방법.
설명 : 가능하다면 나는 HttpServletRequest
물체.
해결책
이 데이터에 더 쉽게 액세스하는 방법이 있지만 인터페이스는 하나의 호출로 전체 URL을 얻을 수있는 가능성을 제공하지 않습니다. 수동으로 구축해야합니다.
public static String makeUrl(HttpServletRequest request)
{
return request.getRequestURL().toString() + "?" + request.getQueryString();
}
나는 봄 MVC 시설 에서이 작업을 수행하는 방법에 대해 모른다.
어디에나 전달하지 않고 현재 요청에 액세스하려면 Web.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();
Java의 URI 클래스는 다음과 같은 도움을 줄 수 있습니다.
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();
}
JSP 파일에서 :
request.getAttribute("javax.servlet.forward.request_uri")
당신은 또한 추가 할 수 있습니다 UriComponentsBuilder
컨트롤러 메소드의 메소드 서명에. Spring은 현재 요청에서 생성 된 빌더의 인스턴스를 주입합니다.
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
}
빌더를 사용하면 현재 요청을 기반으로 URI를 직접 생성하기 시작할 수 있습니다. 예를 들어 경로 세그먼트를 수정합니다.
호스트 이름까지 URL이 필요한 경우 경로가 아닌 Apache의 공통 lib를 사용하십시오. StringUtil
, 및 URL에서 서브 스트링을 제 3 인덱스까지 추출합니다. /
.
public static String getURL(HttpServletRequest request){
String fullURL = request.getRequestURL().toString();
return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3));
}
예시: 만약에 풀러 ~이다 https://example.com/path/after/url/
그 다음에산출 될거야 https://example.com