[url] Spring MVC에서 현재 URL을 얻는 가장 좋은 방법은 무엇입니까?

클라이언트가 활성 요청에 사용하는 URL을 기반으로 URL을 만들고 싶습니다. 현재 HttpServletRequest객체를 취하는 것보다 더 똑똑한 것이 있습니까? getParameter...()그리고 GET 매개 변수를 포함하여 전체 URL을 다시 작성하는 방법입니다.

설명 : 가능하면 HttpServletRequest개체 사용을 그만두고 싶습니다 .



답변

이 데이터에 더 쉽게 액세스 할 수있는 두 가지 방법이 있지만 인터페이스는 한 번의 호출로 전체 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()


답변

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 생성을 직접 시작할 수 있습니다 (예 : 경로 세그먼트 수정).

UriComponentsBuilderMethodArgumentResolver 도 참조하십시오.


답변

경로가 아닌 호스트 이름까지 URL이 필요한 경우 Apache의 Common Lib 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


답변