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


95

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

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

답변:


111

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

좋아, 이것은 내가 지금까지 한 것과 유사한 접근 방식입니다. 하지만 실제로 HttpServletRequest개체를 사용하지 않고이를 수행하는 방법을 찾고 있습니다. 여러 도우미 클래스 / 메서드를 사용하고 있고 매번 요청 객체를 전달하고 싶지 않기 때문입니다.
Koraktor

알겠습니다. 현재 요청을 전달하지 않고 액세스하는 데 필요한 정보를 추가했습니다.
Daff

청취자에 대한 상기시켜 주셔서 감사합니다. 저는 아직 Spring (및 일반적으로 Java 웹 개발)을 처음 사용합니다. 이제 Spring Security의 UrlUtils. 매력처럼 작동합니다.
Koraktor

제 경우에는 찾아보기 URL 대신 관련보기 경로를 제공합니다. 이것에 대해 어떤 생각?
Md. Shougat Hossain

76

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();

@ m4rtin 나는 내 질문에 답했고 처음에 내 문제를 해결하는 데 도움을 준 사람을 인정하고 싶지 않았습니다.
Koraktor

2
또한 좋은 봄 5.를 위해 나는 내부의 URL 얻을 관리했습니다 ConstraintValidator과를 ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();.
GuiRitter

16

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();
}

그주는 호스트 이름 만
vivex

8

jsp 파일에서 :

request.getAttribute("javax.servlet.forward.request_uri")

3

UriComponentsBuilder컨트롤러 메서드의 메서드 서명에를 추가 할 수도 있습니다 . Spring은 현재 요청에서 생성 된 빌더의 인스턴스를 주입합니다.

@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
    URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
            .replacePath(null)
            .replaceQuery(null)
            .pathSegment("some", "new", "path")
            .build().toUri();
  //...
}

빌더를 사용하여 현재 요청을 기반으로 URI 생성을 직접 시작할 수 있습니다 (예 : 경로 세그먼트 수정).

UriComponentsBuilderMethodArgumentResolver 도 참조하십시오.


삽입 된 파일 UriComponentsBuilder에는 요청의 경로 및 쿼리 매개 변수가 포함되지 않습니다. 당신은 그 사용 중 하나에 액세스해야하는 경우 ServletUriComponentsBuilder.fromCurrentRequest()또는 인스턴스 주입 HttpServletRequest및 사용ServletUriComponentsBuilder.fromRequest(request)
마틴 Devillers을

-1

경로가 아닌 호스트 이름까지 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.