문제

활성 요청에 클라이언트가 사용하는 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를 직접 생성하기 시작할 수 있습니다. 예를 들어 경로 세그먼트를 수정합니다.

또한보십시오 URICOMPONENTSBUILDERMEDODARGUMENTRESOLVER

호스트 이름까지 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top