클라이언트가 활성 요청에 사용하는 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()
UrlUtils
. 매력처럼 작동합니다.
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();
ConstraintValidator
과를 ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();
.
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();
}
UriComponentsBuilder
컨트롤러 메서드의 메서드 서명에를 추가 할 수도 있습니다 . Spring은 현재 요청에서 생성 된 빌더의 인스턴스를 주입합니다.
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
}
빌더를 사용하여 현재 요청을 기반으로 URI 생성을 직접 시작할 수 있습니다 (예 : 경로 세그먼트 수정).
UriComponentsBuilder
에는 요청의 경로 및 쿼리 매개 변수가 포함되지 않습니다. 당신은 그 사용 중 하나에 액세스해야하는 경우 ServletUriComponentsBuilder.fromCurrentRequest()
또는 인스턴스 주입 HttpServletRequest
및 사용ServletUriComponentsBuilder.fromRequest(request)
경로가 아닌 호스트 이름까지 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
HttpServletRequest
개체를 사용하지 않고이를 수행하는 방법을 찾고 있습니다. 여러 도우미 클래스 / 메서드를 사용하고 있고 매번 요청 객체를 전달하고 싶지 않기 때문입니다.